2016-07-15 3 views
3

Я только что закончил this excellent article об обеспечении приложения ASP.NET Web API 2 с помощью OAuth2 против экземпляра ADFS/Windows Azure AD с использованием компонентов промежуточного программного обеспечения ADAL и OWIN.Возможно ли защитить приложение ASP.NET Web API 2 от нескольких поставщиков аутентификации?

Однако, похоже, что весь процесс проверки подлинности, описанный в этой статье, очень «прост в проводке» в конвейере HTTP-запроса и не оставляет места для реализации рабочих процессов аутентификации против других поставщиков проверки подлинности.

Зачем это необходимо?

У меня есть мобильный веб-клиент, в котором «внутренним» и «внешним» пользователям разрешено проходить аутентификацию, чтобы выдавать запросы на соответствующие пользователю данные против конечной точки API.

Хотя «внутренние» пользователи получают свои токены аутентификации от Azure AD/ADFS, «внешние» пользователи должны пройти аутентификацию против другой системы, которая выдает другой токен аутентификации.

Поэтому я должен быть в состоянии различать запросы от «внутренних» и «внешних» пользователей на уровне конечной точки API, чтобы начать правильный рабочий процесс оценки для их различных токенов аутентификации.

Любые указания о том, как достичь этого, будут высоко оценены.

Привет, Маттиас

+1

Я не уверен, что ваш случай использования, но это, кажется, как некоторые из примеров, которые thinktecture использует с identityserver3. https://identityserver.github.io/Documentation/. Мне потребовались выходные, чтобы пройти примеры, но это было довольно просто. Я также добавил identityreboot, который предоставил экраны управления. – Bill

+0

Привет, Билл. Спасибо за подсказку. Это, безусловно, то, что я рассмотрю, поскольку можно [выполнить выборочную проверку для токенов auth] (https://identityserver.github.io/Documentation/docsv2/configuration/serviceFactory.html). –

ответ

0

После того, как немного рытье я нашел following answer, который описывает, как программно проверки маркера аутентификации на основе JWT, выданный потоком аутентификации 2.0 ADFS OAuth с использованием JwtSecurityTokenHandler class. Примеры кода можно найти в связанном ответе.

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

Что-то вдоль этих линий, может быть:

public enum AuthTokenType 
{ 
    OAuth2Bearer, 
    Custom 
} 

public class CustomAuthenticationAttribute : IAuthenticationFilter 
{ 
    public bool AllowMultiple 
    { 
     get 
     { 
      throw new NotImplementedException(); 
     } 
    } 

    public Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken) 
    { 
      HttpRequestMessage incommingRequest = context.Request; 
      HttpHeaders headers = incommingRequest.Headers; 
      string authHeader = GetHeader(headers, "Authorization"); 
      AuthTokenType authTokenType = DetecteAuthTokenType(authHeader); 

      if (authTokenType == AuthTokenType.OAuth2Bearer) 
      { 
       // Validate auth token using the JwtSecurityTokenHandler class 
      } 
      else if (authTokenType == AuthTokenType.Custom) 
      { 
       // Validate auth token using whatever is necessary 
      } 
      else 
      { 
       // auth token doesn't correspond to a recognized type or hasn't been part of the client request - reject request 
      } 
    } 

    public AuthTokenType DetectAuthTokenType(string authHeader) 
    { 
     // Analyze the authorization header string and return its proper type 
    } 

    private string GetHeader(HttpHeaders headers, string key) 
    { 
     IEnumerable<string> keys = null; 
     if (!headers.TryGetValues(key, out keys)) 
      return null; 

     return keys.First(); 
    } 
} 
Смежные вопросы