2012-11-13 30 views
9

Tôi đã ghi đè các CredentialsAuthProvider như vậy:Làm thế nào để chuyển hướng sau khi xác thực trong ServiceStack

public override bool TryAuthenticate(IServiceBase authService, string userName, string password) 
     { 
      //TODO: Auth the user and return if valid login 
      return true; 
     } 

public override void OnAuthenticated(IServiceBase authService, IAuthSession session, IOAuthTokens tokens, Dictionary<string, string> authInfo) 
     { 
      base.OnAuthenticated(authService, session, tokens, authInfo); 

      //User has been authenticated 

      //Find the user's role form the DB 

      if (roleA) 
       //GOTO mypage1 

      if (roleB) 
       //GOTO mypage2 
     } 

tôi thực hiện một bài đơn giản để ~/auth/Credentials và trong khi các công trình thẩm định và phương pháp OnAuthenticated được gọi, làm thế nào để tôi thực sự chuyển hướng người dùng đến trang thích hợp dựa trên một vai trò hoặc một cái gì đó tương tự?

Tôi mệt mỏi để làm như sau trong phương pháp OnAuthenticated nhưng nó không có tác dụng mong muốn:

authService ("/ views/khách hàng");.

Cập nhật sử dụng Người khởi xướng Template (xem bình luận dưới đây):

public class CustomCredentialsAuthProvider : CredentialsAuthProvider 
    { 
     public override bool TryAuthenticate(IServiceBase authService, string userName, string password) 
     { 
      return true; 
     } 

     public override void OnAuthenticated(IServiceBase authService, IAuthSession session, IOAuthTokens tokens, Dictionary<string, string> authInfo) 
     { 
      session.ReferrerUrl = "http://www.msn.com"; 

      base.OnAuthenticated(authService, session, tokens, authInfo); 
     } 
    } 

Và hình thức để POST:

<form method="POST" action="/auth/credentials"> 
     <input name="UserName"/> 
     <input name="Password" type="password"/> 
     <input type="submit"/> 
    </form> 

Trả lời

7

Những nơi khác nhau, nơi bạn có thể thiết lập các liên kết để chuyển hướng đến trong thời gian ServiceStack Authentication, theo thứ tự ưu tiên là:

  1. Các Tiếp tục QueryString, FormData hoặc Yêu cầu DTO biến khi đưa ra yêu cầu để /auth
  2. Các Session.ReferrerUrl Url
  3. Các HTTP Referer HTTP Header
  4. Các CallbackUrl trong AuthConfig của AuthProvider hiện tại sử dụng

Được cung cấp thứ tự ưu tiên này nếu yêu cầu không có Tiếp tục tham số, nó nên sử dụng session.ReferrerUrl, vì vậy bạn có thể làm:

if (roleA) session.ReferrerUrl = "http://myPage1Url"; 
if (roleB) session.ReferrerUrl = "http://myPage2Url"; 
+0

Đã hoạt động ... loại ... đây là hành vi: Tôi phải gửi biểu mẫu hai lần. Đây là thiết lập của tôi: tôi có Trang Nội dung default.cshtml trong thư mục gốc có biểu mẫu đăng nhập. Xem người chơi, sự khác biệt duy nhất tôi có thể thấy là, lần đầu tiên tôi tải trang, tôi không có cookie ss-id. Khi tôi gửi biểu mẫu, máy chủ sẽ gửi lại cho tôi default.cshtml. Nhưng lần này với một ss-id. Nếu tôi gửi lần thứ hai này, chuyển hướng bạn mô tả hoạt động. Whats với ss-id? – legion

+0

Một lưu ý nữa, tôi nhận được ss-pid và tôi có Plugins.Add (new SessionFeature()); trong AppHost. – legion

+0

'ss-id' được mô tả trong [Trang Wiki phiên dịch vụ của ServiceStack] (https://github.com/ServiceStack/ServiceStack/wiki/Sessions) – mythz

2

mythz,

Tốt gọi vào làm OSS này. :)

Bạn là chính xác về thứ tự ưu tiên:

  1. Các Continue QueryString, FormData hoặc Yêu cầu DTO biến khi đưa ra yêu cầu đến/auth
  2. Các Session.ReferrerUrl Url Các HTTP
  3. Referer HTTP header
  4. các CallbackUrl trong AuthConfig của AuthProvider hiện tại sử dụng

Vì vậy, trong ví dụ của tôi, tôi không có biến Query QueryString, Form Data hoặc Request DTO và tôi không có CallbackUrl, và chắc chắn không phải là Session.ReferrerUrl vì đây là bài đăng đầu tiên của Phiên.

Từ AuthService.cs:

var referrerUrl = request.Continue 
    ?? session.ReferrerUrl 
    ?? this.RequestContext.GetHeader("Referer") 
    ?? oAuthConfig.CallbackUrl; 

By referrerUrl mặc định sẽ có giá trị tiêu đề Referer từ yêu cầu. Và đó là những gì sẽ được gán cho tiêu đề Địa tiếp tục xuống phương pháp Post của AuthService.cs:

if (!(response is IHttpResult)) 
        { 
         return new HttpResult(response) { 
          Location = referrerUrl 
         }; 
        } 

Khi chứng thực, và session.ReferrerUrl được thiết lập ở đây phản ứng sẽ được gửi cho khách hàng với tài sản Location trên bộ kết giới thiệu ban đầu, không phải là giá trị dưới đây:

public override void OnAuthenticated(IServiceBase authService, IAuthSession session, IOAuthTokens tokens, Dictionary<string, string> authInfo) 
     { 
      session.ReferrerUrl = "http://www.msn.com"; 
     } 

Nó chỉ trên POST thứ hai của cùng một phiên client sẽ điều hướng đến www.msn.com (trong ví dụ này) bởi vì phiên đã được dân cư. Tôi nghĩ rằng điều này:

var referrerUrl = request.Continue 
       ?? session.ReferrerUrl 
       ?? this.RequestContext.GetHeader("Referer") 
       ?? oAuthConfig.CallbackUrl; 

Cần được xác định sau cuộc gọi để xác thực.

+0

Đồng ý, cố định [trong cam kết này] (https://github.com/ServiceStack/ServiceStack/commit/49833b731d2d8e402be358088ca060cb8bab42f0), có sẵn trong bản phát hành tiếp theo của ServiceStack vào cuối tuần. BTW, cảm thấy tự do để gửi một yêu cầu kéo cho các công cụ tương lai như thế này :) – mythz

+1

Awesome. Sẽ làm cho thời gian tiếp theo, và btw, khuôn khổ tuyệt vời. Tôi sẽ không nhìn lại ... Tôi chắc rằng bạn đã nghe điều này trước đây nhưng SS cần thêm tài liệu và thực hành tốt nhất. – legion

+0

Tôi nghĩ [ServiceStack wiki] (https://github.com/ServiceStack/ServiceStack/wiki) đã khá toàn diện. Đó là một wiki cộng đồng, vì vậy nếu bạn cảm thấy một cái gì đó có thể được cải thiện - hãy thêm nó vào. – mythz

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