2013-05-22 30 views
7

Có cách nào thay thế cho plugin tính năng phiên trong servicestack không? Trong một số trường hợp, tôi không thể sử dụng cookie để khớp với phiên được ủy quyền trong việc triển khai dịch vụ của mình. Có khả năng giải quyết phiên sử dụng mã thông báo trong tiêu đề http của yêu cầu không? Giải pháp ưu tiên cho điều đó trong trường hợp trình duyệt chặn cookie là gì?Cách thay thế cho phiên/xác thực dựa trên cookie

Trả lời

7

Tôi đang sử dụng ServiceStack mà không có nhà cung cấp phiên làm việc và xác thực.

Tôi sử dụng thuộc tính làm bộ lọc yêu cầu để thu thập thông tin người dùng (id và mã thông báo), từ cookie, tham số chuỗi hoặc tiêu đề yêu cầu. Bạn có thể cung cấp thông tin này sau khi người dùng đăng nhập. Bạn thêm một cookie mới vào phản hồi và chèn thông tin id và mã thông báo trên máy khách khi hiển thị chế độ xem, vì vậy bạn có thể sử dụng cho tiêu đề http và tham số truy vấn cho các liên kết.

public class AuthenticationAttribute : Attribute, IHasRequestFilter 
{ 
    public void RequestFilter(IHttpRequest request, IHttpResponse response, object dto) 
    { 
     var userAuth = new UserAuth { }; 
     if(!string.IsNullOrWhiteSpace(request.GetCookieValue("auth")) 
     { 
      userAuth = (UserAuth)request.GetCookieValue("auth"); 

     } 
     else if (!string.IsNullOrEmpty(request.Headers.Get("auth-key")) && 
      !string.IsNullOrEmpty(request.Headers.Get("auth-id"))) 
     { 
      userAuth.Id = request.Headers.Get("id"); 
      userAuth.Token = request.Headers.Get("token"); 
     } 
     authenticationService.Authenticate(userAuth.Id, userAuth.token); 
    } 
    public IHasRequestFilter Copy() 
    { 
     return new AuthenticationAttribute(); 
    } 
    public int Priority { get { return -3; } } // negative are executed before global requests 
} 

Nếu người dùng không được ủy quyền, tôi sẽ chuyển hướng người đó vào thời điểm này.

Dự án của tôi hỗ trợ SPA. Nếu người dùng tiêu thụ API bằng xmlhttprequests, công cụ xác thực được thực hiện với tiêu đề. Tôi tiêm thông tin đó trên AngularJS khi trang được tải, và sử dụng lại nó trên tất cả các yêu cầu (xem một phần, api tiêu thụ, vv). ServiceStack là công cụ mạnh mẽ cho loại công cụ này, bạn có thể dễ dàng định cấu hình ứng dụng AngularJS và công cụ xem ServiceStack để làm việc cạnh nhau, xác thực mọi yêu cầu, toàn cầu hóa ứng dụng của bạn, v.v.

Trong trường hợp bạn không có cookie và yêu cầu không được gọi là javascript, bạn có thể hỗ trợ xác thực mà không cần cookie nếu bạn luôn tạo liên kết chuyển id và mã thông báo dưới dạng tham số truy vấn và chuyển chúng qua đầu vào ẩn trên biểu mẫu, ví dụ.

4

@Guilherme Cardoso: Trong giải pháp hiện tại của tôi, tôi đang sử dụng PreRequestFilters và tính năng phiên tích hợp sẵn.

My workflow/Cách giải quyết là như sau:

Khi người dùng được ủy quyền tôi mất cookie và gửi cho khách hàng bằng cách sử dụng một tiêu đề http. Bây giờ khách hàng có thể gọi dịch vụ nếu cookie được đặt trong tiêu đề http (Cấp quyền) của yêu cầu.

Để đạt được điều này, tôi chuyển hướng tiêu đề ủy quyền giả mạo tới cookie của yêu cầu bằng cách sử dụng PreRequestFilter. Bây giờ tôi có thể sử dụng tính năng phiên. Cảm thấy như một hack nhưng làm việc cho thời điểm ;-)

public class CookieRestoreFromAuthorizationHeaderPlugin : IPlugin 
{ 
    public void Register(IAppHost appHost) 
    { 
     appHost.PreRequestFilters.Add((req, res) => 
      { 
       var cookieValue = req.GetCookieValue("ss-id"); 

       if(!string.IsNullOrEmpty(cookieValue)) 
        return; 

       var authorizationHeader = req.Headers.Get("Authorization"); 

       if (!string.IsNullOrEmpty(authorizationHeader) && authorizationHeader.ToLower().StartsWith("basictoken ")) 
       { 
        var cookie = Encoding.UTF8.GetString(Convert.FromBase64String(authorizationHeader.Split(' ').Last())); 

        req.Cookies.Add("ss-id",new Cookie("ss-id",cookie)); 
        req.Items.Add("ss-id",cookie); 
       } 
      }); 
    } 
} 
+0

Cảm ơn cho điều này, đây là mảnh cuối cùng trong việc thực hiện CORS tôi qua Ajax/kiễu góc để cho phép tôi để lấy id phiên trở lại trong cuộc gọi Auth của tôi, thêm nó làm tiêu đề tùy chỉnh trong các cuộc gọi Ajax tương ứng của tôi, và sau đó KHÔNG phải tạo một nhà cung cấp xác thực tùy chỉnh trong ngăn xếp dịch vụ để lấy tiêu đề khi tiêu chuẩn mong đợi một cookie. –