2017-02-21 17 views
2

Here - это то, как я создал атрибут авторизации на основе требований. Но у меня есть некоторые сомнения относительно того, как эта работа.защищенный webapi с действующим JWT на основании требований

Учитывая код из моего класса запуска:

public void Configuration(IAppBuilder app) 
    { 
     if (app == null) 
     { 
      throw new ArgumentNullException(nameof(app)); 
     } 

     app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions 
     { 
      Authority = ConfigurationManager.AppSettings["Authentication:Authority"], 
      RequiredScopes = ConfigurationManager.AppSettings["Authentication:Scopes"].Split(' ').ToList(), 
      PreserveAccessToken = true 
     }); 
    } 

Я ожидал, что если у меня есть этот атрибут на мой контроллер и я посылаю недопустимый маркер (недействительная подпись) запрос будет автоматически отвергнут, как несанкционированные, но выполняется код из атрибута.

Не должно OWIN Сначала подтвердить токен?

Как убедиться, что токен действителен (действительная стриктура, подпись, истек и т. Д.) И только после проверки претензий?

+0

из предыдущего вопроса: если вы измените оператор возврата 'возврат token.Claims.Any' с' возвращением token.Claims.All' вы все еще получаете эту ошибку? – Tinwor

+0

@Tinwor Для этого потребовалось бы, чтобы _all_ претензии на токен были идентичны, а не просто проверяли, соответствует ли какой-либо один из них –

ответ

0

Вопрос находится в пределах вашего связанного вопроса в вашем ClaimAuthorizationAttribute - он никогда не звонит base.IsAuthorized(), тем самым обходя встроенные механизмы защиты, предлагаемые AuthorizeAttribute.

Вместо того, чтобы просто вернуться сюда после того, как видим, является ли настоящее требование:

return token.Claims.Any(c => c.Type.Equals(this.Claim) && c.Value.Equals("True", StringComparison.OrdinalIgnoreCase)); 

Вы должны вместо этого продолжать с убедившись, что базовый класс удовлетворен, и, таким образом, сам маркер действительно, слишком :

var claimValid = token.Claims.Any(c => c.Type.Equals(this.Claim) && c.Value.Equals("True", StringComparison.OrdinalIgnoreCase)); 
if (claimValid) 
    return base.IsAuthorized(); 
else 
    return false; 
+0

. Я думал об этом параметре, но затем я посмотрел на исходный код (https: // github .com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web.Http/AuthorizeAttribute.cs) Я видел, что это не подтверждает токен ... –

+0

@Buda Не напрямую, но он проверяет, пользователь аутентифицируется, чего не будет, если у них нет действительного токена –

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