2013-05-21 30 views
5

Làm cách nào để triển khai kịch bản sau bằng ServiceStack?Cách thực hiện xác thực dựa trên mã thông báo bằng ServiceStack

yêu cầu ban đầu đi vào http://localhost/auth có một tiêu đề Phép định nghĩa như thế này:

Authorization: Basic skdjflsdkfj=

Việc thực hiện IAuthProvider xác nhận chống lại một cửa hàng sử dụng và trả về một mã thông báo phiên như nội dung phản hồi (JSON).

Các khách hàng sử dụng thẻ này một sẽ gửi lại nó chống lại các yêu cầu tiếp theo như http://localhost/json/reply/orders sử dụng tiêu đề ủy quyền như thế này:

Authorization: BasicToken <TokenFromPreviousSuccessfulLogin>

Sử dụng một AuthenticateAttribute Tôi muốn gắn cờ Dịch vụ của tôi để sử dụng xác thực.

Tôi nên triển khai xác thực mã thông báo cho các yêu cầu tiếp theo như thế nào? Tôi nên triển khai IAuthProvider để cung cấp mã thông báo như thế nào? Làm cách nào để đăng ký Nhà cung cấp, v.v ...? Sử dụng RequestFilters hoặc sử dụng AuthFeature?

Trả lời

7

ServiceStack's JWT AuthProviderAPI Key AuthProvider cả hai sử dụng Xác thực dựa trên mã thông báo.

Nếu không BasicAuth Provider là một lớp rất đơn giản rằng chỉ cần trích xuất vào username và password từ BasicAuth Header và đánh giá nó:

public override object Authenticate(...) 
{ 
    var httpReq = authService.RequestContext.Get<IHttpRequest>(); 
    var basicAuth = httpReq.GetBasicAuthUserAndPassword(); 
    if (basicAuth == null) 
     throw HttpError.Unauthorized("Invalid BasicAuth credentials"); 

    var userName = basicAuth.Value.Key; 
    var password = basicAuth.Value.Value; 

    return Authenticate(authService, session, userName, password, request.Continue); 
} 

Nếu bạn muốn cung cấp hành vi tăng cường, tôi sẽ chỉ đơn giản là thừa hưởng séc lớp này cho tiêu đề Authorization: BasicToken, nếu nó tồn tại, nếu không, hãy gọi phương thức base.Authenticate(...) để thực hiện xác thực ban đầu.

+0

Cảm ơn bạn đã trả lời. Câu hỏi được hướng tới các kịch bản được mô tả [ở đây] (http://stackoverflow.com/questions/16690758/alternative-to-cookie-based-session-authentication). –

+0

@mythz Tôi đã cố gắng làm chính xác điều này, nhưng bạn không thể đặt tên nhà cung cấp hoặc lĩnh vực trên lớp cơ sở, bởi vì BasicAuthProvider không cho phép bạn đặt chúng trong hàm tạo. – Junto

+0

@Tuy nhiên bạn có ý nghĩa gì với nó [không cho phép bạn đặt chúng trong hàm tạo] (https://github.com/ServiceStack/ServiceStack/blob/master/src/ServiceStack/Auth/BasicAuthProvider.cs#L14) ? – mythz

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