使用CORS和Cookie身份验证的ASP.NET身份/ OData缺少身份验证Cookie
我有一个ASP.NET身份站点和一个ASP.NET OData站点。
这两个站点都启用了CORS,并且这两个站点都使用ASP.NET Identity CookieAuthentication。
当我在我的计算机上使用IIS(不是表达式)在本地执行这两个站点时,AUTH cookie正在传递到OData站点的每个请求的标题中。
但是,当我将站点部署到生产IIS服务器时,在调用生产OData站点时,标题缺少AUTH cookie。
生产和我的本地IIS都有相同的域名和CORS设置为允许所有。使用CORS和Cookie身份验证的ASP.NET身份/ OData缺少身份验证Cookie
的WebApiConfig有
cors = new Http.Cors.EnableCorsAttribute("*", "*", "*");
config.Enable(cors);
有人问之前,是机器关键是站点之间的相同。
UPDATE
这似乎是一个CORS问题。
当两个站点位于本地计算机上时,它们使用相同的主机名和域名,但是当站点位于生产服务器上时,它们具有不同的主机名和相同的域名。
我终于得到了这个工作。
在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);
}
即使它并不在现场的OData存在,你不能用一个完整的URL到其他网站上的“LOGINPATH”是必需的为登录路径。
我使用“OnApplyRedirect”重定向到实际的登录页面。
我不确定“config.EnableCors”和“app.UseCors”之间有什么区别,但EnableCors似乎现在正在工作。
您可能需要在OAuthAuthorizationServerProvider中指定“Access-Control-Allow-Origin”。
我正在使用OWIN,但你应该可以做类似的事情。
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
尝试在您的OWIN启动类中添加策略,如下所示。请记住,Startup类可能有一些不同的类文件,因为它是一个部分类。另外,请检查ConfigureAuth方法以查看是否根据您的需要设置了所有内容。例如,您将Identity的外部登录Cookie设置为在ConfigureAuth方法中复制,以允许外部登录Cookeies(如Facebook和Google)。
public void Configuration(IAppBuilder app)
{
//
app.UseCors(CorsOptions.AllowAll);
ConfigureAuth(app);
}
app.UseExternalSignInCookie(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ExternalCookie);