2013-02-28 36 views
6

Tôi đang cố viết một ứng dụng di động sẽ nhận dữ liệu từ trang web dựa trên webapi còn lại.Web bảo mậtAPI với JWT

Trang web phải được bảo mật qua ACS (vì có thể có nhiều nhà cung cấp danh tính).

Ứng dụng di động của tôi hiện đang truy vấn url sau https://xx.accesscontrol.windows.net/v2/metadata/IdentityProviders.js?protocol=javascriptnotify&realm=http://xx.azurewebsites.net/&version=1.0 để nhận danh sách các IP.

Sau đó tôi cho phép người dùng chọn IP và sau đó sử dụng điều khiển trình duyệt web, tôi hiển thị cho họ thông tin đăng nhập.

Khi người dùng đã đăng nhập, tôi nắm bắt phản hồi và trích xuất mã thông báo, nhưng bây giờ tôi không thực sự chắc chắn mình nên làm gì. Mã thông báo trông giống như sau: -

{"appliesTo":"http://****.azurewebsites.net/", 
"context":null, 
"created":1362069383, 
"expires":1362072983, 
"securityToken":"... a lot of text:-)", 
"tokenType":"urn:ietf:params:oauth:token-type:jwt"} 

Vì vậy, tôi đoán tôi nên dùng phần securityToken và thêm phần này vào phần tiêu đề Cấp phép để nhận yêu cầu?

Câu hỏi 1 là làm cách nào để đính kèm mã thông báo - tôi chỉ cần đính kèm bit mã thông báo bảo mật hay tôi phải căn cứ 64 mã hóa nhiều và đính kèm nó làm tiêu đề Cấp quyền?

Câu hỏi 2 Tôi làm cách nào để định cấu hình webapi để xử lý JWT? Sau khi tôi đã sửa đổi ACS phát hành thẻ JWT, và tôi đã cài đặt JWTSecurityTokenHandler tôi vẫn nhận được lỗi sau (đây là với xác thực thụ động):

JWT10310: Unable to validate signature. validationParameters.SigningTokenResolver type: 'System.IdentityModel.Tokens.IssuerTokenResolver', was unable to resolve key to a token. 
The SecurityKeyIdentifier is: 
'SecurityKeyIdentifier 
    (
    IsReadOnly = False, 
    Count = 1, 
    Clause[0] = X509ThumbprintKeyIdentifierClause(Hash = 0x2FEE3EE96B019D4BA0C046124B77C652EEF768E5) 
    ) 
'. validationParameters.SigningToken was null. 

Cảm ơn

Ross

Trả lời

8

Mặc dù bạn aren' t bằng cách sử dụng Thư viện xác thực Azure, this AAL code sample is helpful để hiển thị cách sử dụng JWT Token Handler mới để xác thực các yêu cầu đối với API Web bằng Trình xử lý thông báo HTTP trong đường dẫn yêu cầu. Mã này xử lý rõ ràng JWTs do ACS cấp. Đặc biệt, hãy xem lớp TokenValidationHandler trong Global.asax.cs. Dòng chảy như sau:

  1. Yêu cầu đến từ ứng dụng khách được kiểm tra bởi trình xử lý tin nhắn.
  2. Tiêu đề ủy quyền được kiểm tra và xác thực bằng JWTTokenHandler.
  3. Nếu mã thông báo JWT hợp lệ, JWTTokenHandler sẽ khởi tạo một đối tượng ClaimsPrincipal mới. Nếu mã thông báo không hợp lệ, phản hồi HTTP 401 trái phép sẽ được trả lại.

Quay lại câu hỏi đầu tiên của bạn, bạn chỉ cần giá trị "securityToken" (giống như eyJ0eXAiOiJK...) để tạo tiêu đề ủy quyền như Authorization: Bearer eyJ0eXAiOiJK.... Khi điều này được thông qua trong một yêu cầu tới Web API của bạn, JWTTokenHandler sẽ xác nhận hợp lệ nó thông qua Trình xử lý tin nhắn. Tất nhiên điều này giả định rằng Web API của bạn đã được cấu hình đúng cách để biết về người thuê ACS và miền bảo mật mà bạn đã sử dụng để nhận mã thông báo từ ACS ngay từ đầu.

Chỉnh sửa: Hãy xem các mẫu & hướng dẫn thực hành về bảo vệ các dịch vụ REST và truy cập chúng từ ứng dụng dành cho thiết bị di động - kịch bản rất giống có thể giúp cung cấp cho bạn nhiều ngữ cảnh hơn.

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