我有一个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现在似乎正在工作。