Безопасный WebAPI с JWT

Я пытаюсь написать мобильное приложение, которое будет получать данные с сайта на основе WebAPI rest.

сайт должен быть защищен через ACS (так как может быть несколько поставщиков удостоверений).

мое мобильное приложение в настоящее время запрашивает следующий url https://xx.accesscontrol.windows.net/v2/metadata/IdentityProviders.js?protocol=javascriptnotify&realm=http://xx.azurewebsites.net/&version=1.0 чтобы получить список IPs.

затем я разрешаю пользователю выберите IP, а затем с помощью элемента управления веб-браузера я покажу им логин.

Как только пользователь вошел в систему, я фиксирую ответ и извлекаю токен, но теперь я не совсем уверен, что я должен делать. Маркер выглядит так:-

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

Итак, я предполагаю, что я должен взять часть securityToken и добавить ее часть заголовка авторизации в запрос get?

Вопрос 1-Как я должен прикрепить токен - я просто прикрепляю бит маркера безопасности или должен ли я кодировать лот на базе 64 и снова присоединять его в качестве заголовка авторизации?

Вопрос 2 Как настроить webapi для обработки JWT? После того, как я изменил ACS для выдачи токенов JWT, и я установил JWTSecurityTokenHandler, я все еще получаю следующую ошибку (это с пассивной аутентификацией):

 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.

спасибо

Росс

1 ответов


хотя вы не используете библиотеку проверки подлинности Azure,этот пример кода AAL полезен в показе, как использовать новый обработчик токенов JWT для проверки подлинности запросов к веб-API с помощью обработчика HTTP-сообщений в конвейере запросов. Код явно обрабатывает JWTs, выданные ACS. В частности, посмотрите на TokenValidationHandler класс Global.asax.cs. Поток идет так:

  1. входящий запрос от клиентского приложения проверены сообщение обработчик.
  2. заголовок Authorization проверена с помощью JWTTokenHandler.
  3. если токен JWT допустим, jwttokenhandler создает экземпляр нового объекта ClaimsPrincipal. Если маркер недействителен, возвращается неавторизованный ответ HTTP 401.

возвращаясь к вашему первому вопросу, нужно просто "securityToken" значение (что-то вроде eyJ0eXAiOiJK...), чтобы сделать заголовок Authorization Authorization: Bearer eyJ0eXAiOiJK.... Когда это передается в запросе к вашему веб-API, JWTTokenHandler проверит его через обработчик сообщений. Конечно, это предполагает, что ваш веб-API был настроен правильно, чтобы знать о клиенте ACS и домене безопасности, который вы использовали для получения маркера от ACS в первую очередь.

Edit: взгляните на шаблоны и рекомендации по обеспечению безопасности служб REST и доступ к ним из мобильного приложения - очень похожий сценарий, который может помочь дать вам больше контекста.