OWIN Cookie身份验证和跨域AngularJS客户端

时间:2014-12-30 00:32:32

标签: angularjs authentication cookies signalr owin

应用程序设置

客户端 - AngularJS(在client.domain.com上托管)

API + SignalR - 在api.domain.com上托管

SignalR设置类

public void Configuration(IAppBuilder app)
{
    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie
    });

    app.Map("/signalr", map =>
    {
        map.UseCors(CorsOptions.AllowAll);
        var hubConfiguration = new HubConfiguration
        {
            EnableJSONP = true
        };
        map.RunSignalR(hubConfiguration);
    });
}

我从身份验证服务

开始关注
AuthenticationManager.SignOut();
List<Claim> claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.Name, myuserid));
ClaimsIdentity id = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie);
HttpContext.Current.GetOwinContext().Authentication.SignIn(new AuthenticationProperties() { IsPersistent = false }, id);

身份验证响应类似于

HTTP/1.1 200 OK
Cache-Control: private
Pragma: no-cache
Content-Length: 556
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/7.5
Access-Control-Allow-Origin: *
Set-Cookie: ASP.NET_SessionId=pvasgf4q2klfbmk4oojqkxm5; path=/; HttpOnly
X-AspNet-Version: 4.0.30319
Set-Cookie: .AspNet.ApplicationCookie=1lBbz_FRNvxt1AhwkzZHFoiyhyZgsasNXStV3SbjQUHt0hqxTG--yXtjYNquB4zmQn-6M99pqHRPHaT4uf8g1JAnqg5WldD65IJ_FxYoEucf_WvV1fY4pwf774Cyo6fhI5nVk9Z6fdpjY422eo0GIibIMhaV9QvHNaiSsbFO0koT-CnhQuD5DED_418nP7m4FBbXdwIbFM_squ0bVYKXuB35jm57zVk9hUVWdlPmWxc; path=/; HttpOnly
X-Powered-By: ASP.NET
Date: Tue, 30 Dec 2014 00:20:29 GMT

当应用程序向信号发送者/协商者发出请求时,它会收到401(未经授权),因为在身份验证响应中收到的cookie未通过signalr请求发送。

我有什么遗失的吗?

更新1

当客户端和api托管在同一个域中时,以上所有方法都可以正常工作。

客户 - www.domain.com/client

API - www.domain.com/api

更新2

在进一步挖掘之后,我意识到这个问题根本与信号器无关。我写了一个轻量级客户端,看看我是否可以通过一个简单的get请求进行身份验证并跟进。我在api.domain.com/lightclient上托管了客户端,并向api.domain.com/api发出api请求。以下get请求具有身份验证cookie。但是,当我将客户端移动到client.domain.com时,浏览器会删除cookie。

0 个答案:

没有答案