首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CORS的ASP.NET标识/ OData和丢失Auth的cookie身份验证

使用CORS的ASP.NET标识/ OData和丢失Auth的cookie身份验证
EN

Stack Overflow用户
提问于 2015-07-13 02:35:27
回答 3查看 1.1K关注 0票数 0

我有一个ASP.NET标识站点和一个ASP.NET OData站点。

这两个站点都启用了CORS,而且两个站点都使用ASP.NET Identity CookieAuthentication。

当我在我的计算机上使用IIS (非表示)本地执行两个站点时,将在每个请求的头中将AUTH传递给OData站点。

但是,当我将站点部署到生产IIS服务器时,当调用生产OData站点时,头将丢失AUTH。

生产和本地IIS都有相同的域名,并且设置了CORS以允许所有的域名。

WebApiConfig有

代码语言:javascript
复制
cors = new Http.Cors.EnableCorsAttribute("*", "*", "*");
config.Enable(cors);

在有人问之前,是的,机器钥匙在网站之间是一样的。

更新

这似乎是CORS的问题。

当两个站点都在我的本地机器上时,它们使用相同的主机名和域名,但是当站点位于生产服务器上时,它们有不同的主机名和相同的域名。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-20 13:36:14

我终于把这个搞定了。

在ASP.NET标识站点中,我有以下内容:

代码语言:javascript
复制
// 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站点上,我有以下内容:

代码语言:javascript
复制
// 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现在似乎起作用了。

票数 0
EN

Stack Overflow用户

发布于 2015-07-13 14:33:51

您可能需要在您的OAuthAuthorizationServerProvider中指定“访问控制-允许-原产地”。

我正在使用OWIN,但是您应该能够做类似的事情。

代码语言:javascript
复制
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
票数 0
EN

Stack Overflow用户

发布于 2015-07-13 21:32:42

尝试将策略添加到您自己的启动类中,如下所示。请记住,Startup类可能有一些不同的类文件,因为它是一个部分类。另外,检查ConfigureAuth方法,看看是否根据您的需要设置了所有内容。例如,您将在ConfigureAuth方法中复制的外部签名cookie身份设置为允许外部签名(如facebook和google )。

代码语言:javascript
复制
    public void Configuration(IAppBuilder app)
    {
        // 
        app.UseCors(CorsOptions.AllowAll);
        ConfigureAuth(app);

    }


        app.UseExternalSignInCookie(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ExternalCookie);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31374701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档