【问题标题】:ASP MVC Single Application Multi-Domain AuthenticationASP MVC 单应用多域认证
【发布时间】:2016-01-02 21:55:34
【问题描述】:

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

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

 <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 时,我也指定了二级域:

 System.Web.HttpCookie MyCookie = System.Web.Security.FormsAuthentication.GetAuthCookie(lName, false);
                    MyCookie.Domain = lSecondLevelDomain;
                    FormsAuthentication.SetAuthCookie(lName, false);

跨不同的域,这不起作用,因为实际域将与 web.config 中指定的域不匹配,也不与 cookie 匹配。

目标是:

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

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

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

【问题讨论】:

    标签: asp.net-mvc authentication cross-domain


    【解决方案1】:

    在深入编程之前,请查看How does SO's new auto-login feature work? 以了解如何实现此类场景。

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

    如果您强烈考虑生成的绝对返回 URL 的有效性,也可以使用以下代码:

    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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-08-23
      • 1970-01-01
      • 2022-11-05
      • 1970-01-01
      • 1970-01-01
      • 2017-01-13
      • 2015-06-09
      • 1970-01-01
      • 2023-04-01
      相关资源
      最近更新 更多