zoukankan      html  css  js  c++  java
  • asp.net core 系列之允许跨域访问-1(Enable Cross-Origin Requests:CORS)

    接上篇的允许跨域

    4.CORS 策略(Policy)的选项

    这里讲解Policy可以设置的选项:

    • 设置允许的访问源
    • 设置允许的HTTP methods
    • 设置允许的请求头(request header)
    • 设置暴露的响应头(response header)
    • 跨不同源请求的证书(Credentials)
    • 设置过期时间

    AddPolicy 在StartUp.ConfigureServices方法中调用;对于一些选项,先阅读一下,CORS是怎么工作的,可能会有帮助

    设置允许的源(Origins)

    AllowAnyOrigin  :允许CORS请求从任何源来访问,这是不安全的

    注意:指定AllowAnyOrigin 和AllowCredentials 是一种不安全的配置,可能会导致 跨站请求伪造(cross-site request forgery:CSRF)。

    当应用使用这两个配置时,CORS服务返回一个无效的CORS响应。

    SetIsOriginAllowedToAllowWildcardSubdomains:设置策略的 IsOriginAllowed 属性,使可以匹配一个配置的带通配符的域名

    options.AddPolicy("AllowSubdomain",
        builder =>
        {
            builder.SetIsOriginAllowedToAllowWildcardSubdomains();
        });

    设置允许的HTTP methods

    AllowAnyMethod:

    • 允许任何HTTP method
    • 影响预检请求(preflight request)和 Access-Control-Allow-Methods header

    设置允许的请求头(request header)

    要允许一个CORS请求中指定的请求头,可以使用 WithHeaders 来指定。

    options.AddPolicy("AllowHeaders",
        builder =>
        {
            builder.WithOrigins("http://example.com")
                   .WithHeaders(HeaderNames.ContentType, "x-custom-header");
        });

    允许所有的请求头

    options.AddPolicy("AllowAllHeaders",
        builder =>
        {
            builder.WithOrigins("http://example.com")
                   .AllowAnyHeader();
        });

    一个CORS中间件策略用 WithHeaders匹配特定的头,而请求中的头部(记录在Access-Control-Request-Headers)需要精确匹配WithHeader中的头部才可以跨域。

    例如:

    应用中策略

    app.UseCors(policy => policy.WithHeaders(HeaderNames.CacheControl));

    请求中的部分数据:

    Access-Control-Request-Headers: Cache-Control, Content-Language

    CORS中间件会拒绝这个请求,因为Content-Language(HeaderNames.ContentLanguage)没有在WithHeaders中列出来;

    设置暴露的响应头

    默认情况下,浏览器不会暴露所有的响应头给应用。

    默认可用的响应头是:

    • Cache-Control
    • Content-Language
    • Content-Type
    • Expires
    • Last-Modified
    • Pragma

    如果想让其他的头部对应用可用,可以调用 WithExposedHeaders:

    options.AddPolicy("ExposeResponseHeaders",
        builder =>
        {
            builder.WithOrigins("http://example.com")
                   .WithExposedHeaders("x-custom-header");
        });

    跨源(cross-origin)请求中的证书(Credentials)

    默认情况下,浏览器不允许在跨域请求中发送证书。

    证书中包含缓存(cookies)和HTTP验证协议(HTTP authentication schemes)。

    要再跨域中发送证书,客户端(浏览器)必须设置 XMLHttpRequest.withCredentials 为 true。

    直接使用 XMLHttpRequest 

    var xhr = new XMLHttpRequest();
    xhr.open('get', 'https://www.example.com/api/test');
    xhr.withCredentials = true;

    使用JQuery

    $.ajax({
      type: 'get',
      url: 'https://www.example.com/api/test',
      xhrFields: {
        withCredentials: true
      }
    });

    使用 Fetch API

    fetch('https://www.example.com/api/test', {
        credentials: 'include'
    });

    服务端也需要允许证书。使用AllowCredentials 

    options.AddPolicy("AllowCredentials",
        builder =>
        {
            builder.WithOrigins("http://example.com")
                   .AllowCredentials();
        });

    包含 Access-Control-Allow-Credentials 头部的HTTP 响应(HTTP Response) 将告诉浏览器:服务器允许跨域请求的证书;

    如果浏览器发送证书,但是响应没有包含一个有效的 Access-Control-Allow-Credentials 头部 , 浏览器不会暴露响应给应用,跨域失败;

    允许跨域证书是一个安全风险。

    在跨域中,如果 Access-Control-Allow-Credentials 头部出现了,则意味着 设置为所有的源 (setting origin to " * ")会失效。

    参考网址

    https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-2.2#cors-policy-options

  • 相关阅读:
    Unable To Open Database After ASM Upgrade From Release 11.1 To Release 11.2
    11g Understanding Automatic Diagnostic Repository.
    How to perform Rolling UpgradeDowngrade in 11g ASM
    Oracle 11.2.0.2 Patch 说明
    Pattern Matching Metacharacters For asm_diskstring
    Steps To MigrateMove a Database From NonASM to ASM And ViceVersa
    Upgrading ASM instance from Oracle 10.1 to Oracle 10.2. (Single Instance)
    OCSSD.BIN Process is Running in a NonRAC Environment
    Steps To MigrateMove a Database From NonASM to ASM And ViceVersa
    On RAC, expdp Removes the Service Name [ID 1269319.1]
  • 原文地址:https://www.cnblogs.com/Vincent-yuan/p/10801513.html
Copyright © 2011-2022 走看看