Безопасный 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
. Поток идет так:
- входящий запрос от клиентского приложения проверены сообщение обработчик.
- заголовок Authorization проверена с помощью JWTTokenHandler.
- если токен JWT допустим, jwttokenhandler создает экземпляр нового объекта ClaimsPrincipal. Если маркер недействителен, возвращается неавторизованный ответ HTTP 401.
возвращаясь к вашему первому вопросу, нужно просто "securityToken"
значение (что-то вроде eyJ0eXAiOiJK...
), чтобы сделать заголовок Authorization Authorization: Bearer eyJ0eXAiOiJK...
. Когда это передается в запросе к вашему веб-API, JWTTokenHandler проверит его через обработчик сообщений. Конечно, это предполагает, что ваш веб-API был настроен правильно, чтобы знать о клиенте ACS и домене безопасности, который вы использовали для получения маркера от ACS в первую очередь.
Edit: взгляните на шаблоны и рекомендации по обеспечению безопасности служб REST и доступ к ним из мобильного приложения - очень похожий сценарий, который может помочь дать вам больше контекста.