2015-07-13 187 views
0

我有一个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问题。
当两个站点位于本地计算机上时,它们使用相同的主机名和域名,但是当站点位于生产服务器上时,它们具有不同的主机名和相同的域名。

回答

0

我终于得到了这个工作。
在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似乎现在正在工作。

0

您可能需要在OAuthAuthorizationServerProvider中指定“Access-Control-Allow-Origin”。

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

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

尝试在您的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);