首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP MVC单应用多域认证

ASP MVC单应用多域认证
EN

Stack Overflow用户
提问于 2015-10-01 18:39:07
回答 1查看 1.8K关注 0票数 0

我有以下严格的客户特别要求的场景:使用Asp.NET MVC4的单一网站,可通过具有单点登录机制的各种域访问。

通过在webconfig中指定第二级域,我成功地使表单身份验证与子域一起工作

代码语言:javascript
复制
 <authentication mode="Forms">
  <forms name="SingleSignOn" loginUrl="/Login/LoginRedirect" timeout="10" slidingExpiration="false" domain="domain.ml"  cookieless="UseCookies" enableCrossAppRedirects="true">
    <credentials passwordFormat="SHA1" />
  </forms>
</authentication>

另外,在登录逻辑中调用FormsAuthentication.SetAuthCookie时,我还指定了二级域:

代码语言:javascript
复制
 System.Web.HttpCookie MyCookie = System.Web.Security.FormsAuthentication.GetAuthCookie(lName, false);
                    MyCookie.Domain = lSecondLevelDomain;
                    FormsAuthentication.SetAuthCookie(lName, false);

在不同的域中,这是不起作用的,因为实际的域不会与web.config中指定的域匹配,也不会与cookies匹配。

目标是:

用户访问domain1.com用户重定向到logindomain.com并创建经过身份验证的cookie用户重定向回domain1.com

用户总是被重定向到一个“登录域”,cookie是使用该域创建的,并且总是使用相同的cookie跨域进行身份验证。

是否可以覆盖Authorize属性的逻辑,以便允许使用登录域的cookie而不是用户最初使用的域进行授权?

EN

回答 1

Stack Overflow用户

发布于 2015-11-16 05:27:27

在开始编程之前,先看一下How does SO's new auto-login feature work?,以了解如何实现这样的场景。

然后看看Forms Authentication Across ApplicationsSingle Sign On (SSO) for cross-domain ASP.NET applications。现在您可以随心所欲地实现您的目标了:)

如果您非常重视所得到的绝对返回URL的有效性,也可以使用以下代码:

代码语言:javascript
复制
public class Startup {
    public void Configuration(IAppBuilder app) {
        app.UseCookieAuthentication(new CookieAuthenticationOptions {
            AuthenticationMode = AuthenticationMode.Active,
            LoginPath = new PathString("/account/login"),
            LogoutPath = new PathString("/account/logout"),
            Provider = new CookieAuthenticationProvider { OnApplyRedirect = ApplyRedirect },
        });
    }

    private static void ApplyRedirect(CookieApplyRedirectContext context) {
        Uri absoluteUri;
        if (Uri.TryCreate(context.RedirectUri, UriKind.Absolute, out absoluteUri)) {
            var path = PathString.FromUriComponent(absoluteUri);
            if (path == context.OwinContext.Request.PathBase + context.Options.LoginPath)
                context.RedirectUri = "http://accounts.domain.com/login" +
                    new QueryString(
                        context.Options.ReturnUrlParameter,
                        context.Request.Uri.AbsoluteUri);
                        // or use context.Request.PathBase + context.Request.Path + context.Request.QueryString
        }

        context.Response.Redirect(context.RedirectUri);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32885464

复制
相关文章

相似问题

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