使用CORS和cookie身份验证的ASP.NET Identity / OData缺少Auth cookie

时间:2015-07-13 02:35:28

标签: cookies asp.net-web-api cors odata asp.net-identity

我有一个ASP.NET身份站点和一个ASP.NET OData站点 两个站点都启用了CORS,并且两个站点都使用ASP.NET Identity CookieAuthentication 当我使用IIS(不是快速)在我的计算机上本地执行这两个站点时,AUTH cookie将在每个请求的标头中传递到OData站点。
但是当我将站点部署到生产IIS服务器时,在调用生产OData站点时,标头缺少AUTH cookie 生产和本地IIS都具有相同的域名,并且CORS设置为允许所有域名。

WebApiConfig

cors = new Http.Cors.EnableCorsAttribute("*", "*", "*");
config.Enable(cors);

在有人要求之前,是的,机器密钥在站点之间是相同的。

UPDATE
这似乎是一个CORS问题 当两个站点都在我的本地计算机上时,它们使用相同的主机名和域名,但是当站点位于生产服务器上时,它们具有不同的主机名和相同的域名。

3 个答案:

答案 0 :(得分:0)

您可能需要在OAuthAuthorizationServerProvider中指定“Access-Control-Allow-Origin”。

我正在使用OWIN,但你应该可以做类似的事情。

context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });

答案 1 :(得分:0)

尝试在OWIN启动类中添加策略,如下所示。请记住,Startup类可能有一些不同的类文件,因为它是一个部分类。另外,检查ConfigureAuth方法以查看是否根据您的需要设置了所有内容。例如,您在ConfigureAuth方法中将下面复制的Identity的外部登录cookie设置为允许外部登录Cookeies,如facebook和google。

    public void Configuration(IAppBuilder app)
    {
        // 
        app.UseCors(CorsOptions.AllowAll);
        ConfigureAuth(app);

    }


        app.UseExternalSignInCookie(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ExternalCookie);

答案 2 :(得分:0)

我终于开始工作了。
在ASP.NET Identity站点中,我有以下内容:

// configure OAuth for login
app.UseCookieAuthentication(new CookieAuthenticationOptions {
        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
        Provider = new CookieAuthenticationProvider(),
        LoginPath = new PathString("/Account/Login.aspx"),
        CookieName = ".TESTAUTH",
        CookieDomain = ".test.com",
        CookieSecure = CookieSecureOption.Always
    });

似乎ASP.NET身份站点上的重要部分是" CookieName,CookieDomain和Machine Key"必须匹配OData网站上的那个。

然后在OData网站上我有以下内容:

// configure OAuth for login
app.UseCookieAuthentication(new CookieAuthenticationOptions {
        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
        Provider = new CookieAuthenticationProvider { OnApplyRedirect = ApplyRedirect },
        LoginPath = new PathString("/Account/Login.aspx"),
        CookieName = ".TESTAUTH",
        CookieDomain = ".test.com",
        CookieSecure = CookieSecureOption.Always
    });

// build the configuration for web api
HttpConfiguration config = new HttpConfiguration();

// Enable CORS (Cross-Origin Resource Sharing) for JavaScript / AJAX calls
// NOTE: USING ALL "*" IS NOT RECOMMENDED
var cors = new Http.Cors.EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);

// call the web api startup
WebApiConfig.Register(config);
app.UseWebApi(config);

private void ApplyRedirect(CookieApplyRedirectContext context)
{
    Uri absoluteUri = null;
    if (Uri.TryCreate(context.RedirectUri, UriKind.Absolute, absoluteUri)) 
    {
        var path = PathString.FromUriComponent(absoluteUri);
        if (path == context.OwinContext.Request.PathBase + context.Options.LoginPath) 
        {
            QueryString returnURI = new QueryString(context.Options.ReturnUrlParameter, context.Request.Uri.AbsoluteUri);
            context.RedirectUri = "https://www.test.com/Account/Login.aspx" + returnURI.ToString;
        }
    }
    context.Response.Redirect(context.RedirectUri);
}

" LoginPath"即使OData站点上不存在,也是必需的,并且您无法使用完整的URL到另一个站点获取登录路径。
我用了#34; OnApplyRedirect"重定向到实际的登录页面。

我不确定" config.EnableCors"之间的区别是什么?和" app.UseCors"但是EnableCors似乎现在正在运作。