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

时间:2014-10-30 15:55:09

标签: signalr cors owin

参考SignalR Hubs API Guide

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

// 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);

但是,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

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

public void Configuration(IAppBuilder app)
{                
    app.UseCors(CorsOptions.AllowAll);
    app.MapSignalR();
}

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

1 个答案:

答案 0 :(得分: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) } }); 的创建方式。你可以做点什么

PolicyResolver

如您所见,您设置了Func<IOwinRequest, Task<CorsPolicy>>属性,即IOwinContext。根据{{​​1}}(针对当前请求),您需要返回the source(另请参阅CorsPolicy)。这应具有微调策略所需的属性。列表属性具有私有设置器(可能是为了避免潜在的null指针),但它们都是在默认构造函数中初始化的,因此您应该能够添加它们。