ASP MVC单应用多域认证



我有以下严格的场景,具体要求的客户:一个单一的网站使用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中指定的域不匹配。配置和不使用cookie

目的是:

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

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

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

在深入编程之前,看看SO的新自动登录功能是如何工作的?要了解如何实现这些场景。

然后看看跨应用程序的表单认证和跨域ASP的单点登录(SSO)。网络应用程序。现在你可以达到你想要的目的了

如果您强烈考虑最终返回的绝对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);
    }
}

相关内容

  • 没有找到相关文章

最新更新