我有一个ASP.NET标识站点和一个ASP.NET OData站点。
这两个站点都启用了CORS,而且两个站点都使用ASP.NET Identity CookieAuthentication。
当我在我的计算机上使用IIS (非表示)本地执行两个站点时,将在每个请求的头中将AUTH传递给OData站点。
但是,当我将站点部署到生产IIS服务器时,当调用生产OData站点时,头将丢失AUTH。
生产和本地IIS都有相同的域名,并且设置了CORS以允许所有的域名。
WebApiConfig有
cors = new Http.Cors.EnableCorsAttribute("*", "*", "*");
config.Enable(cors);在有人问之前,是的,机器钥匙在网站之间是一样的。
更新
这似乎是CORS的问题。
当两个站点都在我的本地机器上时,它们使用相同的主机名和域名,但是当站点位于生产服务器上时,它们有不同的主机名和相同的域名。
发布于 2015-07-20 13:36:14
我终于把这个搞定了。
在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现在似乎起作用了。
发布于 2015-07-13 14:33:51
您可能需要在您的OAuthAuthorizationServerProvider中指定“访问控制-允许-原产地”。
我正在使用OWIN,但是您应该能够做类似的事情。
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });发布于 2015-07-13 21:32:42
尝试将策略添加到您自己的启动类中,如下所示。请记住,Startup类可能有一些不同的类文件,因为它是一个部分类。另外,检查ConfigureAuth方法,看看是否根据您的需要设置了所有内容。例如,您将在ConfigureAuth方法中复制的外部签名cookie身份设置为允许外部签名(如facebook和google )。
public void Configuration(IAppBuilder app)
{
//
app.UseCors(CorsOptions.AllowAll);
ConfigureAuth(app);
}
app.UseExternalSignInCookie(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ExternalCookie);https://stackoverflow.com/questions/31374701
复制相似问题