2013-12-18 35 views
7

Tôi đang sử dụng WebApi và xác thực dựa trên mã thông báo cho các bộ điều khiển api của tôi (Authorization: bearer xyzabc ..) Bây giờ tôi có hub signalR và muốn xác thực khách hàng bằng cùng một token mà họ có trên máy khách bên.Authorization Header trong SignalR 2.0

Tôi làm như thế nào? Điều này link cho thấy làm thế nào để gửi mã thông báo thông qua tham số url, nhưng tôi không chắc chắn làm thế nào tôi có thể sử dụng mã thông báo đó và xác thực người dùng ở phía máy chủ.

Trả lời

0

Tôi sẽ không gửi mã thông báo mỗi lần. Tôi muốn thiết lập chính người dùng ngữ cảnh của bạn trên phương thức ảo OnConnected và đọc từ một chuỗi truy vấn được truyền từ một mã thông báo.

Trong trường hợp của tôi. Tôi vừa tạo ra một lớp trừu tượng được thừa hưởng từ lớp Hub và sau đó nhồi vào oauth tuyên bố logic tạo ra của tôi ở đó. Sau đó, các trung tâm bê tông thường xuyên của tôi chỉ được thừa kế từ lớp trung tâm tùy chỉnh cơ sở của tôi.

Một tùy chọn khác là sử dụng thuộc tính ủy quyền tùy chỉnh hoặc mô-đun kênh trung tâm khác.

Tôi nghĩ rằng các chiến thuật này có thể giữ mã của bạn KHÔ và mở rộng.

2

Tôi đã giải quyết điều này bằng cách chuyển mã thông báo dưới dạng tham số của phương thức Hub thay vì tiêu đề. nhưng tôi tưởng tượng nó có thể làm điều đó bằng cách sử dụng tiêu đề quá (chỉ cần giải nén mã thông báo từ Context.Headers hoặc một cái gì đó).

Dù bằng cách nào, sau khi nhận mã thông báo trong phương thức trung tâm của bạn, chỉ cần sử dụng mã này.

public Task SendMessage(string message, string token) 
    { 
     var ticket = Startup.OAuthOptions.AccessTokenFormat.Unprotect(token); 
     bool isAuth = ticket.Identity.IsAuthenticated; 
     //You can retrieve other details like username and userid from ticket 
     ...rest of your code.. 
    } 
0

Tôi đã phát hiện ra rằng khi bạn gọi trình xử lý thẻ/Mã thông báo mặc định từ Web API từ một cái gì đó như JQuery, trình duyệt cũng được gửi một cookie được sử dụng để xác thực bạn bằng SignalR.

Bạn nên có thể sử dụng thuộc tính [Authorize] cũng như "Context.User.Identity" trong phương thức trung tâm SignalR để nhận người dùng hiện tại miễn là bạn đã gọi/Mã thông báo có chứng chỉ hợp lệ từ trình duyệt trước khi kết nối với hub.

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