2013-04-29 31 views
9

Có thể trả về phản hồi xác thực tùy chỉnh không? Tôi đã có nhà cung cấp xác thực tùy chỉnh của riêng mình kế thừa từ CredentialsAuthProvider.Trả về đối tượng phản hồi tùy chỉnh xác thực từ xác thực ServiceStack

Tôi muốn quay trở lại phiên ngày hết hạn trong phản ứng, vì vậy mà khách hàng biết chính xác khi nào phiên máy chủ của họ sẽ hết hạn:

{ 
    "sessionId": "bG27SdxbRkqJqU6xv/gvBw==", 
    "userName": "[email protected]", 
    "sessionExpires": "2013-04-29T03:27:14.0000000", 
    "responseStatus": {} 
} 

tôi có thể ghi đè lên các phương pháp Authenticate như vậy:

public override object Authenticate(IServiceBase authService, IAuthSession session, Auth request) 
{ 
    // get base response 
    var response = base.Authenticate(authService, session, request); 

    // grab the session 
    var customSession = authService.GetSession() as CustomUserSession; 

    // if response can be cast and customSession exists 
    if (response is AuthResponse && customSession != null) 
    { 
     // cast 
     var authResponse = response as AuthResponse; 

     // build custom response 
     var customAuthResponse = new CustomAuthResponse 
      { 
       ReferrerUrl = authResponse.ReferrerUrl, 
       SessionExpiry = customSession.SessionExpires, 
       SessionId = authResponse.SessionId, 
       ResponseStatus = authResponse.ResponseStatus, 
       UserName = authResponse.UserName 
      }; 
     return customAuthResponse; 
    } 

    // return the standard response 
    return response; 
} 

Tính năng này hoạt động tốt, ngoại trừ trường hợp phiên đã hoạt động. Trong trường hợp đó, các phương pháp kiểm tra AuthService bài viết cho một phiên hợp lệ và automatically returns a standard AuthResponse, và không có cách nào rõ ràng để ghi đè lên nó:

var alreadyAuthenticated = response == null; 
response = response ?? new AuthResponse { 
    UserName = session.UserAuthName, 
    SessionId = session.Id, 
    ReferrerUrl = referrerUrl, 
}; 

Tiếp theo ý tưởng Paaschpa của dưới đây, các lực lượng sau tái auth luôn luôn được tái xác nhận , nhưng có vẻ như có thể có những rủi ro liên quan đến việc để lại nhiều phiên hoạt động mở:

public override bool IsAuthorized(IAuthSession session, IOAuthTokens tokens, Auth request = null) 
{ 
    // force re-authentication. Not great, but no other obvious way to do this 
    if (request != null) 
    { 
     return false; // auth or re-auth calls 
    } 

    return base.IsAuthorized(session, tokens, request); 
} 

Có ai nghĩ cách tốt hơn để làm điều này không? Tôi có thể thực hiện AuthenticationService của riêng mình, nhưng tôi không chắc chắn làm thế nào tôi sẽ ghi đè lên AuthFeature?

+0

Liệu một cái gì đó giống như sự giúp đỡ này? https://github.com/ServiceStack/ServiceStack/wiki/Sessions#using-typed-sessions-in-servicestack – paaschpa

+0

@paaschpa thật đáng buồn là không. Giá trị phiên tùy chỉnh đó là một cái gì đó được giữ trên máy chủ. Tôi muốn hiển thị phản hồi xác thực tùy chỉnh. Nếu bất cứ điều gì nó là như thế này: http://stackoverflow.com/questions/13855996/how-to-change-http-401-response-in-servicestack nhưng cho một đăng nhập thành công, chứ không phải là một thất bại. – Junto

Trả lời

3

Nếu tôi hiểu chính xác, bạn muốn trả lại phản hồi tùy chỉnh sau khi người dùng xác thực với '/auth/credentials'. Vì bạn đã có CredentialsAuthProvider của riêng mình, tôi nghĩ bạn chỉ có thể ghi đè Xác thực và trả lại phản hồi của riêng bạn.

Subclass của CredentialsAuthProvider

public class MyCredentialsAuthProvider : CredentialsAuthProvider 
{ 
    public override object Authenticate(ServiceStack.ServiceInterface.IServiceBase authService, IAuthSession session, Auth request) 
    { 
     //let normal authentication happen 
     var authResponse = (AuthResponse)base.Authenticate(authService, session, request); 

     //return your own class, but take neccessary data from AuthResponse 
     return new 
      { 
       UserName = authResponse.UserName, 
       SessionId = authResponse.SessionId, 
       ReferrerUrl = authResponse.ReferrerUrl, 
       SessionExpires = DateTime.Now 
      }; 

    } 
} 
+0

Tôi đã có khá nhiều điều này chạy như bạn có nó ở trên. Tuy nhiên, bạn nên gọi lại/xác thực bằng cùng thông tin đăng nhập, trong khi phiên vẫn hợp lệ (tức là không hết hạn), khi đó một AuthResponse được lặp lại thay vì MyCustomAuthResponse. Có vẻ như trong trường hợp đó, phương thức Xác thực không được tiếp cận. Tôi nghĩ rằng tôi sẽ phải làm điều này thêm vào chuỗi. Có thể ghi đè Post(). – Junto

+0

hmmm ... bạn có thể ghi đè IsAuthorized để luôn trả về false và thêm logic vào các ghi đè khác của bạn để xử lý trường hợp phiên người dùng đã được ủy quyền/xác thực. Có vẻ như rất nguy hiểm. – paaschpa

+0

Ngoài việc tạo nhiều phiên hoạt động cho cùng một người dùng, bạn có thể nghĩ ra bất kỳ rủi ro nào khác không? – Junto

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