Cookies 使用CORS和cookie身份验证的ASP.NET标识/OData缺少身份验证cookie

Cookies 使用CORS和cookie身份验证的ASP.NET标识/OData缺少身份验证cookie,cookies,asp.net-web-api,cors,odata,asp.net-identity,Cookies,Asp.net Web Api,Cors,Odata,Asp.net Identity,我有一个ASP.NET身份站点和一个ASP.NET OData站点。 两个站点都启用了CORS,并且都使用ASP.NET身份验证。 当我使用IIS(非express)在我的计算机上本地执行这两个站点时,每个请求的头中都会传递身份验证cookie到OData站点。 但是,当我将站点部署到生产IIS服务器时,在调用生产OData站点时,标头缺少验证cookie。 生产和我的本地IIS都具有相同的域名,CORS设置为允许所有 WebApiConfig已经 cors = new Http.Cors.En

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

WebApiConfig已经

cors = new Http.Cors.EnableCorsAttribute("*", "*", "*");
config.Enable(cors);
在任何人询问之前,是的,不同站点之间的机器密钥是相同的

更新
这似乎是CORS的问题。

当两个站点都位于我的本地计算机上时,它们使用相同的主机名和域名,但当站点位于生产服务器上时,它们具有不同的主机名和相同的域名

您可能需要在OAuthAuthorizationServerProvider中指定“访问控制允许来源”

我正在使用OWIN,但你应该能够做类似的事情

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

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

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

    }


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

我终于成功了。
在ASP.NET标识站点中,我有以下内容:

// 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和机器密钥”必须与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作为登录路径。
我使用“OnApplyRedirect”重定向到实际登录页面

我不确定“config.EnableCors”和“app.UseCors”之间的区别是什么,但EnableCors现在似乎正在工作