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