2010-04-12 32 views
23

Có những ví dụ phong nha của sẵn sau đây:ASP.NET MVC 2 và xác thực sử dụng WIF (Windows nhận dạng Foundation)

Nhìn qua the WIF SDK, có những ví dụ của việc sử dụng WIF kết hợp với sử dụng ASP.NET WSFederationAuthenticationModule (FAM) để chuyển hướng đến một trang web ASP.NET mỏng da trên đầu trang của Dịch vụ Mã Bảo mật (STS) mà người dùng sử dụng để xác thực (thông qua cung cấp tên người dùng và mật khẩu).

Nếu tôi hiểu chính xác WIF và quyền truy cập dựa trên xác nhận quyền sở hữu, tôi muốn ứng dụng cung cấp màn hình đăng nhập của riêng họ. thông qua một tiêu chuẩn bảo mật (WS- *), và mong đợi một mã thông báo SAML được trả về. Lý tưởng nhất, các SessionAuthenticationModule sẽ làm việc theo các ví dụ sử dụng FAM kết hợp với SessionAuthenticationModule tức là có trách nhiệm xây dựng lại IClaimsPrincipal từ cookie phân đoạn bảo mật phiên và chuyển hướng đến trang đăng nhập ứng dụng của tôi khi phiên bảo mật hết hạn.

Tôi có thể mô tả điều gì bằng cách sử dụng FAMSessionAuthenticationModule với cài đặt web.config thích hợp hoặc tôi cần tự mình viết một số HttpModule để xử lý việc này? Ngoài ra, đang chuyển hướng đến một trang web STS mỏng nơi người dùng đăng nhập vào phương pháp de facto trong một kịch bản yêu cầu thụ động?

Trả lời

19

Một ví dụ về WIF + MVC có sẵn trong chương này của "bố danh tính Hướng dẫn":

http://msdn.microsoft.com/en-us/library/ff359105.aspx

tôi khuyên bạn nên đọc vài chương đầu tiên để hiểu tất cả các nguyên tắc cơ bản. bài viết trên blog này bao gồm các chi tiết cụ thể của MVC + WIF:

http://blogs.msdn.com/b/eugeniop/archive/2010/04/03/wif-and-mvc-how-it-works.aspx

Kiểm soát trải nghiệm đăng nhập là hoàn toàn tốt đẹp. Bạn chỉ nên triển khai STS của riêng bạn (trong miền của bạn, với giao diện của bạn & cảm thấy, v.v.). Ứng dụng của bạn chỉ đơn giản là dựa vào nó cho AuthN (đó là lý do tại sao một ứng dụng thường được gọi là "bên phụ thuộc").

Lợi thế của kiến ​​trúc là authN được ủy nhiệm cho 1 thành phần (STS) và không được trải rộng trên nhiều ứng dụng. Nhưng lợi thế khác (rất lớn) là bạn có thể cho phép các kịch bản phức tạp hơn rất dễ dàng. Ví dụ: giờ đây bạn có thể liên kết với các nhà cung cấp danh tính của tổ chức khác.

Hy vọng nó giúp Eugenio

@RisingStar:

Các token (chứa những tuyên bố) có thể được mã hóa tùy ý (nếu không họ sẽ nằm trong văn bản rõ ràng). Đó là lý do tại sao SSL luôn được đề xuất cho các tương tác giữa trình duyệt và STS.

Lưu ý rằng mặc dù chúng ở dạng văn bản rõ ràng, không thể giả mạo vì mã thông báo được ký điện tử.

+0

cảm ơn Eugenio, tôi nghĩ rằng tôi đã đọc Hướng dẫn nhận dạng bản quyền, rõ ràng không phải là tôi đã bỏ lỡ Fabrikam là một ứng dụng MVC. Tôi chắc chắn sẽ có một cái nhìn vào nó một lần nữa. Tôi cũng đã có một cái nhìn tại blog của Dominick Baier và nghĩ rằng thực hiện một cuộc gọi đến một sts hoạt động từ máy chủ web trên trang đăng nhập là cuối cùng những gì tôi sau. –

+0

Tôi không thấy rằng bằng cách sử dụng WIF trong ASP.net MVC là bất kỳ khác với việc sử dụng các hình thức ASP.net. –

+1

Các nguyên tắc chính xác giống nhau. Chỉ có một vài chi tiết triển khai. Sự khác biệt phổ biến nhất là: -Trong ứng dụng biểu mẫu web, bạn thường dựa vào WIF cho tất cả trao đổi giao thức (passiveRedirectEnable = true). Trong một ứng dụng MVC, bạn sẽ tắt tính năng đó và xử lý theo chương trình như được giải thích trong bài đăng blog của tôi. - Trong ứng dụng MVC, bạn thường triển khai thuộc tính IAuthorizationFilter. Trong các biểu mẫu Web, không tồn tại và bạn chỉ cần dựa vào cơ chế ủy quyền ASP.NET hiện có (hoặc gọi IsInRole, v.v.) –

13

Đó là một câu hỏi thú vị mà bạn đã hỏi. Tôi biết rằng vì lý do gì đó, Microsoft đã đưa ra khuôn khổ "Windows Identity Foundation" này mà không cần nhiều tài liệu. Tôi biết điều này bởi vì tôi đã được giao nhiệm vụ tìm ra cách sử dụng nó với một dự án mới và tích hợp nó với cơ sở hạ tầng hiện có. Tôi đã tìm kiếm trên web trong nhiều tháng để tìm kiếm thông tin tốt.

Tôi đã lấy một góc hơi khác để giải quyết vấn đề bạn mô tả.

Tôi đã đăng ký ứng dụng hiện có và tích hợp hệ thống ống nước WIF của Microsoft vào đó. Bằng cách đó, tôi có nghĩa là tôi có một ứng dụng mà người dùng đăng nhập. Ứng dụng đăng nhập gửi thông tin xác thực do người dùng cung cấp đến máy chủ khác trả về danh tính người dùng (hoặc cho biết lỗi đăng nhập).

Nhìn vào một số ví dụ của Microsoft, tôi thấy rằng họ làm như sau: Xây dựng một SignInRequestMessage từ một chuỗi truy vấn (được tạo ra bởi một ứng dụng bên dựa), xây dựng một dịch vụ bảo vệ token từ một lớp tùy chỉnh, và cuối cùng gọi FederatedSecurityTokenServiceOperations. ProcessSignInresponse với httpcontext.response hiện tại. Thật không may, tôi thực sự không thể giải thích tốt ở đây; bạn thực sự cần phải xem xét các mẫu mã.

Một số mã của tôi rất giống với mẫu mã. Nơi bạn sẽ quan tâm đến việc thực hiện rất nhiều logic của riêng bạn là trong GetOutputClaimsIdentity. Đây là hàm xây dựng nhận dạng xác nhận quyền sở hữu mô tả người dùng đã đăng nhập.

Bây giờ, đây là những gì tôi nghĩ bạn thực sự muốn biết. Đây là những gì Microsoft không cho bạn biết trong tài liệu của họ, AFAIK.

Khi người dùng đăng nhập, họ sẽ được chuyển hướng trở lại ứng dụng của bên phụ thuộc. Bất kể ứng dụng đăng nhập hoạt động như thế nào, các lớp WIF sẽ gửi phản hồi tới trình duyệt của người dùng có chứa đầu vào HTML "ẩn" có chứa chứng chỉ ký mã thông báo và xác nhận quyền sở hữu của người dùng. (Các tuyên bố sẽ được trong văn bản rõ ràng). Khi kết thúc phản hồi này là chuyển hướng đến trang web của bên bạn.Tôi chỉ biết về hành động này vì tôi đã chụp nó với "Fiddler"

Khi trở lại trang web của bên phụ thuộc, các lớp WIF sẽ xử lý phản hồi (trước khi bất kỳ mã nào của bạn được chạy). Chứng chỉ sẽ được xác nhận. Theo mặc định, nếu bạn đã thiết lập trang web của bên dựa vào FedUtil.exe (bằng cách nhấp vào "Thêm tham chiếu STS trong ứng dụng bên của bạn từ Visual Studio), lớp của Microsoft sẽ xác minh dấu vân tay chứng chỉ. Khung công tác WIF đặt cookie trong trình duyệt của người dùng (Theo kinh nghiệm của tôi, tên cookie bắt đầu bằng "FedAuth") chứa các xác nhận quyền sở hữu của người dùng. xác nhận quyền sở hữu của người dùng trong trang web của bên phụ thuộc bằng cách sử dụng ClaimsAuthenticationClass. Đây là nơi mà mã của bạn đang chạy lại.

Tôi biết điều này khác với những gì bạn mô tả, nhưng tôi có thiết lập này hoạt động. Tôi hi vọng cái này giúp được!

ps. Vui lòng xem các câu hỏi khác tôi đã hỏi về Windows Identity Foundation.

UPDATE: Để trả lời câu hỏi trong bình luận dưới đây:

Một điều mà tôi rời ra là chuyển hướng đến các STS log-on ứng dụng xảy ra bằng cách chuyển hướng với một truy vấn-chuỗi chứa URL của ứng dụng mà người dùng đang đăng nhập. Chuyển hướng này xảy ra tự động trong lần đầu tiên người dùng cố truy cập trang yêu cầu xác thực. Ngoài ra, tôi tin rằng bạn có thể thực hiện chuyển hướng theo cách thủ công với mô-đun WSFederationAuthentication.

Tôi chưa bao giờ cố gắng để làm điều này, nhưng nếu bạn muốn sử dụng một log-on trang trong ứng dụng riêng của mình, tôi tin rằng khuôn khổ nên cho phép bạn sử dụng như sau:

1) đóng gói STS của bạn mã trong thư viện. 2) Tham khảo thư viện từ ứng dụng của bạn. 3) Tạo trang đăng nhập trong ứng dụng của bạn. Đảm bảo rằng trang đó không yêu cầu xác thực. 4) Đặt thuộc tính tổ chức phát hành của phần tử wsFederation trong phần Microsoft.IdentityModel của web.config của bạn vào trang đăng nhập.

+0

Cảm ơn bạn đã dành thời gian trả lời câu hỏi của tôi. Tôi đã xem qua tệp trợ giúp html đã biên dịch đi kèm với WIF SDK và cũng đã trải qua tất cả các ví dụ. Tôi đã chọn ra 'FAM' và' SessionAuthenticationModule' với Reflector và nghĩ rằng tôi có một xử lý tốt về cách nó hoạt động, nhưng tôi đã quan tâm để xem có ví dụ nào bằng cách sử dụng 'FAM' hoặc có thể là một HttpModule tùy chỉnh kết hợp với 'SessionAuthenticationModule' để nhận dạng dựa trên xác nhận quyền sở hữu. FAM có vẻ dễ sử dụng, nhưng không cung cấp nhiều tính linh hoạt ... –

+1

Có lẽ toàn bộ ý tưởng là đăng nhập nên được thực hiện trên một ứng dụng web STS vì nó có nghĩa là bạn không cần phải lo lắng về việc xây dựng một màn hình đăng nhập trong mỗi ứng dụng web của bạn. Tuy nhiên, tôi muốn có thể giữ một giao diện cụ thể cho màn hình đăng nhập cho từng ứng dụng và lý tưởng giữ nó trên cùng một miền để không làm người dùng bối rối (điều này có thể xảy ra vì có nhiều khả năng không) người dùng hiểu biết về công nghệ). Tôi chỉ muốn nhận các thông tin đầu vào, gói chúng trong một cuộc gọi WS-Liên kết tới một STS để xác thực. Suy nghĩ của tôi có bị lệch hướng với ý tưởng đó không? –

+0

Suy nghĩ của bạn không nhất thiết phải bị lệch. Tôi bắt đầu đã có một ứng dụng đăng nhập riêng biệt được sử dụng cho các ứng dụng khác; Tôi chỉ cần thêm STS vào ứng dụng đăng nhập. Tôi tin rằng những gì bạn muốn làm là có thể, nhưng nó sẽ yêu cầu một số thử nghiệm để có được nó và chạy. Tôi đã cập nhật câu trả lời của mình với ý tưởng về cách bạn có thể thực hiện công việc này. –

4

Điều bạn muốn làm là đăng nhập hoạt động. WIF bao gồm WSTrustChannel(Factory) cho phép bạn liên lạc trực tiếp với STS và nhận mã bảo mật. Nếu bạn muốn biểu mẫu đăng nhập của bạn hoạt động theo cách này, bạn có thể làm theo mẫu "WSTrustChannel" từ SDK WIF 4.0. Một khi bạn đã thu được được dấu hiệu, đoạn mã sau sẽ mất rằng token và gọi handler WIF để tạo ra một phiên token và thiết lập cookie thích hợp:

public void EstablishAuthSession(GenericXmlSecurityToken genericToken) 
{ 
    var handlers = FederatedAuthentication.ServiceConfiguration.SecurityTokenHandlers;    
    var token = handlers.ReadToken(new XmlTextReader(
             new StringReader(genericToken.TokenXml.OuterXml))); 

    var identity = handlers.ValidateToken(token).First(); 
    // create session token 
    var sessionToken = new SessionSecurityToken(
     ClaimsPrincipal.CreateFromIdentity(identity)); 
    FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(sessionToken); 
} 

Một khi bạn đã làm điều này, trang web của bạn phải cư xử như nhau như thể việc ký kết thụ động đã xảy ra.

1

Bạn có thể sử dụng Kiểm soát FederatedPassiveSignIn.

+0

Đó là một điều khiển phía máy chủ hoạt động tốt cho các biểu mẫu web, nhưng tự nhiên không phù hợp với các ứng dụng MVC (bởi vì nó là một điều khiển phía máy chủ với runat = "máy chủ"). Bất kỳ đề xuất về điều này? – atconway

0

Đặt cookie của bạn như sau: FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie (sessionToken); Không làm việc cho SSO đối với các tên miền khác.

Để cookie phải được thiết lập bởi STS không phải tại RP.

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