2013-01-04 17 views
5

Tôi đã tạo dịch vụ ServiceStack trên Asp.Net thực hiện xác thực cơ bản. Mọi thứ đang hoạt động tốt trên các tuyến dịch vụ. Tôi có thể đăng nhập và tôi nhận được các cookie phiên được xác thực trên các cuộc gọi tiếp theo. Tôi đang sử dụng một HttpClient cho những yêu cầu đó.Xác thực Trung tâm SignalR bằng cách sử dụng Plugin xác thực ServiceStack

Tôi cũng có một Trung tâm SignalR chạy trên cùng dịch vụ Asp.Net, nhưng Hiệu trưởng không được xác thực trên các phương thức Hub của tôi.

Về cơ bản những gì tôi cần là dành cho ServiceStack để chặn cuộc gọi vào Trung tâm của tôi và xác thực cookie phiên và điền vào Context.User.Identity và đánh dấu nó là đã xác thực. Nếu tôi có thể thiết lập, một thuộc tính [Authorize] đơn giản trên hub của tôi sẽ thực hiện phần còn lại.

Dưới đây là một mẫu mã của tôi:

// set up a HttpClient with a cookie container to hold the session cookie 
var cookieJar = new CookieContainer(); 
var handler = new HttpClientHandler { CookieContainer = cookieJar, UseCookies = true, UseDefaultCredentials = false }; 

var client = new HttpClient(handler) { BaseAddress = _baseUri }; 

client.DefaultRequestHeaders.Authorization = 
new AuthenticationHeaderValue("Basic", 
    Convert.ToBase64String(Encoding.ASCII.GetBytes(string.Format("{0}:{1}", userName, password)))); 

// do client login and get response with session cookie... 
var response = client.PostAsync(...); 

// add the cookies to the SignalR hub connection 
var responseCookies = cookieJar.GetCookies(_baseUri); 
var cookieContainer = new CookieContainer(); 
foreach (Cookie cookie in responseCookies) 
{ 
    cookieContainer.Add(cookie); 
} 
_hubConnection = new HubConnection(_baseUri.ToString()) { CookieContainer = cookieContainer }; 

Sau khi thiết lập này, cookie phiên tôi được gửi đến Hub trên mỗi sự thỉnh nguyện. Bằng cách nào đó tôi cần cho ServiceStack để chặn các yêu cầu đó và đặt người dùng đã được xác thực.

Trả lời

6

Cho phép ServiceStack thực hiện xác nhận và duy trì phiên người dùng. Sau đó, trong các điểm cuối hub SignalR rằng cần xác thực đặt mã này:

var cache = AppHostBase.Resolve<ICacheClient>(); 
var sess = cache.SessionAs<AuthUserSession>(); 
if (!sess.IsAuthenticated) 
    throw new AuthenticationException(); 
+0

Điều đó làm việc kết hợp với mã được đăng ban đầu, nơi tôi đã lưu cookie xác thực vào vùng chứa cookie SignalR. Cảm ơn! – Kevin

2

của Johan công trình câu trả lời nhưng nó không phải là rất thuận tiện để đặt mã này để mọi phương pháp và nếu bạn đặt nó trong các nhà xây dựng trung tâm, nó sẽ thất bại trong web trên trang làm mới với "Chỉ ASP.NET yêu cầu truy cập thông qua Singletons được hỗ trợ" ngoại lệ.

Thay vào đó, tôi đã chọn tạo thuộc tính tùy chỉnh cung cấp cho bạn nhiều quyền kiểm soát hơn đối với ủy quyền cuộc gọi trung tâm và phương thức.

đơn giản thuộc tính sẽ trông như thế này:

[AttributeUsage(AttributeTargets.Class, Inherited = false)] 
public class AuthorizeServiceStack : AuthorizeAttribute 
{ 
    public override bool AuthorizeHubConnection(HubDescriptor hubDescriptor, IRequest request) 
    { 
     return CheckAuthorization(); 
    } 

    public override bool AuthorizeHubMethodInvocation(IHubIncomingInvokerContext hubIncomingInvokerContext, bool appliesToMethod) 
    { 
     return CheckAuthorization(); 
    } 

    private static bool CheckAuthorization() 
    { 
     var cache = AppHostBase.Resolve<ICacheClient>(); 
     var sess = cache.SessionAs<AuthUserSession>(); 
     return sess.IsAuthenticated; 
    } 

} 

Như bạn có thể thấy, các mã cũng giống như trong câu trả lời của Johan nhưng nó sẽ làm việc trong các trang web là tốt, đảm bảo rằng HttpContext.Current là bắt buộc khi bạn đang gọi bộ nhớ cache.SessionAs