2015-06-11 3 views
2

Я играю с сценариями аутентификации и авторизации в Azure AD, и не все понятно для меня.
В настоящее время я смотрю SinglePageApp-WebAPI-AngularJS-DotNet образец проекта.Подтвердить токен доступа для WEB API, защищенный Azure AD

И одна вещь, которую я не могу понять. На стороне клиента мы получаем токен доступа, используя неявный поток грантов - это понятно. Затем мы отправляем запрос в WEB API с Bearer и используем токен в качестве значения. На стороне сервера у нас есть TodoListController с атрибутом Authorize. Таким образом, чтобы попасть в запрос контроллера, необходимо авторизоваться.

Что неясно, как проверка подлинности проверит мой токен доступа (что, если случайный текст отправлен вместо действительного токена доступа?). Я клонировал проект katana и исследовал классы WindowsAzureActiveDirectoryBearerAuthenticationExtensions и OAuthBearerAuthenticationHandler, но я до сих пор не могу найти конкретное место, где происходит валидация.
Как мой WEB API будет знать, что этот конкретный токен доступа действителен и где эта конкретная строка кода, которая отвечает за проверку?

Спасибо!

UPD:

На самом деле я нахожу место. Все работы выполняются в OAuthBearerAuthenticationHandler в методе AuthenticateCoreAsync:

tokenReceiveContext.DeserializeTicket(tokenReceiveContext.Token); 

этот вызов приводит к управлению JwtFormat.Unprotect метода, который выполняет фактическую проверку.
Спасибо @Aram за хорошие заметки.

ответ

2

В вашей службе запуска регистрации Owin и, когда контроллер украшен авторизовать атрибут, то проблема аутентификации будет и Owin попытается проверить маркер на каждый запрос ..

Проверка маркера происходит потому, что вы есть ссылки Owin Dll И у вас есть класс startup.auth в проекте службы ...

вы, наверное, есть что-то вроде этого, что вы включаете Auth вызов в стороне службы:

app.UseWindowsAzureActiveDirectoryBearerAuthentication(
     new WindowsAzureActiveDirectoryBearerAuthenticationOptions 
     { 
      Audience = ConfigurationManager.AppSettings["ida:Audience"], 
      Tenant = ConfigurationManager.AppSettings["ida:Tenant"], 
     }); 

Когда проверка выполняется, промежуточное ПО OWIN будет проверять аудиторию и Арендатора на то, что токен был приобретен, и если они не совпадают с Authz, произойдет сбой ...

В зависимости от того, с помощью обработчика аутентификации вы используете фактический код, вызывающий функцию ValidateToken, находится в классе YOUR_AUTH_HANDLERAuthenticationHandler.

Вот место для OpenId обработчика AuthZ: http://katanaproject.codeplex.com/sourcecontrol/latest#src/Microsoft.Owin.Security.OpenIdConnect/OpenidConnectAuthenticationHandler.cs

Например, если у вас есть обработчик OpenIdConnect AuthZ то проверка маркер находится в: Microsoft.Owin.Security.OpenIdConnect.OpenIdConnectAuthenticationHandler класс и метод Overrride:

protected override async Task<AuthenticationTicket> AuthenticateCoreAsync() 

И код ValidateToekn будет выглядеть (если ваш обработчик AuthZ является OpenId соединение):

ClaimsPrincipal principal = Options.SecurityTokenHandlers.ValidateToken(openIdConnectMessage.IdToken, tvp, out validatedToken); 
+0

«Owin промежуточного слоя будет проверять против аудитории и Арендатором, что токен был получен, и если они не совпадают с Authz, это провалится »- я знаю это, но как это делается? Не могли бы вы указать мне на конкретную строку кода, где это происходит? – Kai

+0

@Kai Обновлен ответ для этого ... – Aram

+0

спасибо за обновление. Он работает для OpenidConnect, но как он работает для токена маркера OAuth? Посмотрите на класс 'OAuthBearerAuthenticationHandler', существует строка' await Options.Provider.ValidateIdentity (context); 'где должна выполняться проверка. 'OAuthBearerAuthenticationProvider' - это реализация для' Options.Provider'. Посмотрите на метод 'ValidateIdentity' - он вызывает делегат OnValidateIdentity', который устанавливается в конструкторе -' context => Task.FromResult (null); '. Итак, никакой проверки вообще нет. Я что-то пропустил? – Kai

Смежные вопросы