正在查看: 标记有标签 cors 的文章(第 1 页 / 共 2 篇)

ABP的语言及使用signalr

折磨人的跨域问题:

XMLHttpRequest cannot load https://api.taskexe.com/signalr/negotiate?clientProtocol=1.5&token=0J2rv2jZ…bpcommonhub"},{"name":"messagehub"}]&_=1488597450711. A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true. Origin 'https://taskexe.com' is therefore not allowed access. The credentials mode of an XMLHttpRequest is controlled by the withCredentials attribute.

意思大约是说,如果Cors使用通配符*则不允许使用 Access-Control-Allow-Credentials: true,两者是矛盾的。在signalr的跨域请求时,application_start中使用了,跨域:

»阅读全文

Tags: cors,abp,signalr

最近遇到的一些坑集合

Angular

异步获取到的数据,在视图上使用自定义filter时,控制台总是报错 input undefined ,这是因为filter会在anagular的第一次消息循环时尝试运行,异步数据尚未加载进来,尝试绑定时数据固然不存在。所以要做判断。

public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider{ 
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
        {
            context.OwinContext.Response.Headers["Access-Control-Allow-Origin"] = "*";
   //....

}
}

CORS

基于web api的应用常常使用基于token的验证方式进行api的访问管理。一般步骤是:

(1)用户输入用户名和密码,提交到web api host.

(2)web api host验证后,返回token给Client, Client使用Cookie存储下来。

(3)后续Client继续是用token访问web api, web api做验证。

这个方法比较简单可行, 资源服务器和验证服务器部署在一个进程里。但是最大的问题是,token过期后如何刷新的问题。简单的方法是把token的过期时间设置的比较长,如一个 月,但不够安全,不符合token的设置本意,所以需要用refresh token的验证机制。简单地说就是,web api host验证后返回两个token,一个是基本的access token,另一个是refresh token。access token过期后,可以用refresh token换取一个新的access token。这里遇到一个cors的问题。即使在web api 的config里加了如下语句:

public static void EnableCors(HttpConfiguration config)
        {
            var cors = new EnableCorsAttribute("*", "*", "*");
            config.EnableCors(cors);
        }

也不行,原因是oauth server的获取access token,不直接经过web api。所以要对oauth server的响应头添加allow-origin。具体如下:

public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
        public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
        {
            context.OwinContext.Response.Headers["Access-Control-Allow-Origin"] = "*";
           //....
       }
}

但是,依然有问题。因为浏览器会发出预检请求(preflight ),api host不能正确应答,以前的cors配置风格不支持预检请求,故需要:

public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
   }
}

问题即可解决。参考地址:

http://stackoverflow.com/questions/24989769/cors-is-not-working-in-web-api-with-owin-authentication

http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/