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



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

WebApiConfig有

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

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


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

你可能需要在OAuthAuthorizationServerProvider中指定"Access-Control-Allow-Origin"

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

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

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

    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 Identity站点的"CookieName, cookieddomain, and the 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到另一个网站的登录路径。
我使用"OnApplyRedirect"来重定向到实际的登录页面。

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

相关内容

  • 没有找到相关文章

最新更新