有人可以使用明确的起源列表提供CorsPolicy实现吗?

K. *_*tes 3 cors signalr owin

请参阅SignalR Hubs API指南

表示配置注释中的以下信息:

// Setup the CORS middleware to run before SignalR.
// By default this will allow all origins. You can 
// configure the set of origins and/or http verbs by
// providing a cors options with a different policy.
map.UseCors(CorsOptions.AllowAll);
Run Code Online (Sandbox Code Playgroud)

但是,System.Web.CorsPolicy的Origins属性有一个私有的setter,没有允许注入源的构造函数,也没有暴露的setter方法.关于Origins列表,它似乎只暴露了一个"AllowAllOrigins"属性,然后是一个无用的Origins getter,它只反映出在CorsPolicy构造过程中构造的空List.


特别值得注意的是,默认的app.UseCors(CorsOptions.AllowAll)设置完全不连贯.通过它自己的工具提示,它是"允许所有标题,所有方法,任何来源和支持凭证的策略."

A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true
Run Code Online (Sandbox Code Playgroud)

我的配置目前是"愚蠢的简单"SignalR配置

public void Configuration(IAppBuilder app)
{                
    app.UseCors(CorsOptions.AllowAll);
    app.MapSignalR();
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以提供一个Microsoft.Owin.Cors.CorsMiddleware示例,该示例将使用Access-Control-Allow-Origin的显式白名单重新实现"AllowAll"选项吗?

khe*_*ang 8

你看过CorsOptions.AllowAll吗?它显示了如何CorsOptions创建.你可以做点什么

var policy = new CorsPolicy
{
    AllowAnyHeader = true,
    AllowAnyMethod = true,
    AllowAnyOrigin = false, // False by default, just left it here.
    SupportsCredentials = true
};

policy.Origins.Add("http://foo.example.com");

app.UseCors(new CorsOptions
{
    PolicyProvider = new CorsPolicyProvider
    {
        PolicyResolver = context => Task.FromResult(policy)
    }
});
Run Code Online (Sandbox Code Playgroud)

如您所见,您设置PolicyResolver属性,即a Func<IOwinRequest, Task<CorsPolicy>>.基于IOwinContext(对于当前请求),您需要返回a CorsPolicy(另请参见其来源).这应具有微调策略所需的属性.列表属性具有私有setter(可能是为了避免潜在的null指针),但它们都是在默认构造函数中初始化的,因此您应该能够添加它们.