2011-09-05 48 views
5

我已經成功地將SSO與WIF集成到了我的兩個Web域中。現在我要求一些用戶使用SSO登錄,而其他用戶不使用SSO。我如何才能做到這一點?使用WIF進行單點登錄

我會感激你的幫助,

感謝

沙赫拉姆賈韋德

+0

你能更具體嗎?很難用這個級別的細節提供答案。 –

+0

更多細節請參考用戶如何登錄?你想如何拆分登錄?這是主動還是被動? – nzpcmad

回答

12

你的問題有點模糊,所以也許這不是正確的答案。讓我把我們的故事(歐金尼奧幫助過的)與它對OP或其他人的幫助的希望聯繫起來。我正在解釋「不適用於其他用戶」,因爲有些用戶不使用SSO:大概他們使用表單身份驗證或不同的東西。

我們在Web應用程序中使用WIF進行SSO,該應用程序還支持wif實現的表單身份驗證版本。

如果有人來到登錄頁面並提供用戶名和密碼,我們使用WIF設置自發布的ClaimsPrincipal。本質上,該網站正在爲自己提供索賠。 FederatedAuthentication以與FormsAuthentication通常相同的方式使用:使用FederatedAuthentication上的靜態方法設置cookie。有點不同,但本質上是相同的。

var token = FederatedAuthentication.SessionAuthenticationModule 
    .CreateSessionSecurityToken(claimsPrincipal, "MyApp.Token", 
    DateTime.UtcNow, DateTime.UtcNow.AddDays(7), false); 
FederatedAuthentication.SessionAuthenticationModule 
    .AuthenticateSessionSecurityToken(token, true); 

我們的Web應用程序使用單個可信提供者(與N個聯合夥伴協商的ADFS服務器)。我們需要一種自定義的方式來決定是否將未經身份驗證的用戶重定向到登錄頁面或ADFS for SSO用戶。我們禁用被動重定向,因此WIF不會自動將人員發送到ADFS。

<wsFederation passiveRedirectEnabled="false" 
    issuer="https://adfs.ourplace.com/adfs/ls/" 
    realm="http://www.ourplace.com" .../> 

從這裏我們使用一個身份驗證屬性(我們使用ASP.NET MVC,但是任何適合您的)。

public class MyAuthorizeAttribute : FilterAttribute, IAuthorizationFilter 
{ 
    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (filterContext.HttpContext.User.Identity.IsAuthenticated) 
      return; // all good 

     RedirectTo(IsSSO() ? GetADFSUrl() : GetSignInUrl(); 
    } 
} 

判斷用戶是否是SSO用戶或未經身份驗證的用戶是Home Realm Discovery問題。不同的人解決它的方式不同對於我們來說,當一個SSO用戶首次使用SSO連接到系統時,我們會在他們的主域(它是ADFS中的聲明提供程序標識符)中放置一個持久cookie。如果Cookie不存在,他們會登錄。如果cookie存在,它們會被重定向到ADFS。網址爲:

var adfsEntryPoint = FederatedAuthentication.WSFederationAuthenticationModule.Issuer; 
var wtRealm = FederatedAuthentication.WSFederationAuthenticationModule.Realm; 
var whr = <from home realm cookie> 
var redirectUrl = string.Format("{0}?wa=wsignin1.0&wtrealm={1}&whr={2}", 
    adfsEntryPoint, 
HttpContext.Server.UrlEncode(wtRealm), 
HttpContext.Server.UrlEncode(whr)); 

如果您直接重定向到N個聯盟合作伙伴,可能會將令牌更新URL存儲在Cookie中。