2011-09-05 43 views
5

Tôi đã tích hợp thành công SSO với WIF trên hai Miền Web của tôi. Bây giờ tôi có một yêu cầu mà một số người dùng đăng nhập bằng SSO và những người dùng khác không sử dụng SSO. Làm thế nào tôi có thể đạt được điều này?Đăng nhập một lần với WIF

tôi sẽ đánh giá cao sự giúp đỡ của bạn,

Cảm ơn

Shahram Javed

+0

Bạn có thể cụ thể hơn không? khó đưa ra câu trả lời với mức chi tiết này. –

+0

Thông tin chi tiết hơn, ví dụ: Làm cách nào để người dùng đăng nhập ngay bây giờ? Làm thế nào bạn muốn chia logons? Điều này có hoạt động hoặc thụ động không? – nzpcmad

Trả lời

12

Câu hỏi của bạn là một chút mơ hồ như vậy có lẽ đây không phải là câu trả lời đúng. Hãy để tôi kể lại câu chuyện của chúng tôi (mà Eugenio đã giúp) với hy vọng nó sẽ giúp OP hoặc người khác. Tôi đang giải thích "không cho người dùng khác" vì một số người dùng không sử dụng SSO: có lẽ họ sử dụng xác thực biểu mẫu hoặc điều gì đó khác.

Chúng tôi sử dụng WIF cho SSO trong ứng dụng web cũng hỗ trợ phiên bản xác thực biểu mẫu được thực hiện wif.

Nếu ai đó truy cập trang Đăng nhập và cung cấp tên người dùng và mật khẩu, chúng tôi sử dụng WIF để đặt ClaimsPrincipal tự cấp. Về cơ bản, trang web đang cung cấp tuyên bố cho chính nó. FederatedAuthentication được sử dụng trong cùng một cách mà FormsAuthentication bình thường là: thiết lập một cookie bằng cách sử dụng một phương thức tĩnh trên FederatedAuthentication. Bit khác nhau, nhưng về cơ bản là cùng một hiệu trưởng.

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

Ứng dụng web của chúng tôi sử dụng một nhà cung cấp duy nhất đáng tin cậy (máy chủ ADFS thương lượng với N đối tác liên kết). Chúng tôi cần một cách tùy chỉnh để quyết định xem có nên chuyển hướng người dùng chưa được xác thực đến trang Đăng nhập hoặc tới ADFS cho người dùng SSO hay không. Chúng tôi vô hiệu hóa chuyển hướng thụ động để WIF không tự động gửi mọi người đến ADFS.

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

Từ đây chúng tôi sử dụng thuộc tính xác thực (chúng tôi sử dụng ASP.NET MVC nhưng bất kỳ điều gì phù hợp với bạn).

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

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

Để quyết định xem người dùng có phải là người dùng SSO hay không khi họ không được xác thực là vấn đề Phát hiện Realm Home. Những người khác nhau giải quyết nó khác nhau. Đối với chúng tôi, khi người dùng SSO lần đầu tiên kết nối với hệ thống bằng SSO, chúng tôi sẽ đặt một cookie liên tục với lĩnh vực gia đình của họ (là Mã nhận dạng nhà cung cấp xác nhận quyền sở hữu trong ADFS). Nếu cookie không có mặt, chúng sẽ chuyển sang Đăng nhập. Nếu cookie có mặt, chúng sẽ được chuyển hướng đến ADFS. URL là:

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ếu bạn chuyển hướng trực tiếp đến N đối tác liên kết, có thể lưu URL gia hạn mã thông báo trong cookie.

Các vấn đề liên quan