2015-10-01 77 views
0

我有以下客戶特別需要的嚴格方案:使用Asp.NET MVC4的單個網站,可通過具有單點登錄機制的各個域訪問。ASP MVC單一應用程序多域身份驗證

我設法通過在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中並沒有與餅乾指定的域匹配。

目的是:

用戶訪問domain1.com 用戶重定向到logindomain.com和認證的cookie創建 用戶重定向回domain1.com

用戶總是重定向到一個「登錄域「,cookie是使用該域創建的,並且始終使用跨域的相同cookie進行身份驗證。

是否可以重寫Authorize屬性的邏輯,以便允許使用登錄域的cookie而不是用戶最初使用的域進行授權?

回答

0

在深入編程之前,請看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); 
    } 
} 
相關問題