2017-02-15 20 views
6

По общему признанию, это первый удар при создании проекта App.Net Core web api. Одним из требований является поддержка OAuth2. Сервер Api и Identity - это два отдельных проекта, оба из которых начинаются с пустого шаблона Asp.Net.Авторизация с помощью Asp.Net Core WebAPI

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

Когда я выполняю запрос Получить на мой ресурс конечной точки, я получаю следующее в первый ...

info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1] 
     Request starting HTTP/1.1 GET http://localhost:12886/v1/mystuff 
info: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerMiddleware[2] 
     Successfully validated the token. 
info: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerMiddleware[3] 
     HttpContext.User merged via AutomaticAuthentication from authenticationScheme: Bearer. 
info: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerMiddleware[8] 
     AuthenticationScheme: Bearer was successfully authenticated. 
info: IdentityModel.AspNetCore.ScopeValidation.ScopeValidationMiddleware[0] 
     Scopes found on current principal: scope: stuffdetails, scope: stuffmover 
info: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerMiddleware[8] 
     AuthenticationScheme: Bearer was successfully authenticated. 
info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[1] 
     Authorization was successful for user: 939d72dd-654c-447f-a65d-d0426b1eca59. 

Таким образом, я могу сказать, промежуточное программное обеспечение проверки мой маркер, чтение областей, и аутентификации токен. Однако, сразу после первоначального успеха, я получаю ошибки авторизации.

info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2] 
     Authorization failed for user: 939d72dd-654c-447f-a65d-d0426b1eca59. 
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1] 
     Authorization failed for the request at filter 'Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter'. 
info: Microsoft.AspNetCore.Mvc.ChallengeResult[1] 
     Executing ChallengeResult with authentication schemes(). 
info: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerMiddleware[13] 
     AuthenticationScheme: Bearer was forbidden. 
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2] 
     Executed action TestApi.StuffController.GetStuff (TestApi) in 32.4439ms 
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2] 
     Request finished in 1207.1769ms 403 

Вот что я считаю, являются соответствующими битами в запуске.

ConfigureServices ...

services.AddMvcCore() 
     .AddAuthorization(opts => 
      { 
       opts.AddPolicy("stuffdetails", 
        policy => policy.RequireClaim("stuffdetails")); 
      } 
     ) 
     .AddJsonFormatters(); 

services.AddOptions(); 

Настройка - Обратите внимание, что я знаю, что мои configOptions правильно, потому что начальный маркер вызов успешен.

var authServerOptions = new IdentityServerAuthenticationOptions 
{ 
    Authority = configOptions.Value.AuthServerSettings.AuthServerURI, 
    RequireHttpsMetadata = configOptions.Value.AuthServerSettings.RequiresHttpsMetaData, 
    ApiName = configOptions.Value.AuthServerSettings.ApiName, 
    AllowedScopes = configOptions.Value.AuthServerSettings.AllowedScopes, 
    SupportedTokens = IdentityServer4.AccessTokenValidation.SupportedTokens.Jwt, 
    AuthenticationScheme = "Bearer", 
    SaveToken = true, 
    ValidateScope = true 
}; 

app.UseIdentityServerAuthentication(authServerOptions); 
app.UseMvc(); 

Материал Контроллер

[Route("v1/[controller]")] 
[Authorize(ActiveAuthenticationSchemes = "Bearer")] 
public class StuffController : Controller 
{ 
    [HttpGet] 
    [Authorize(Policy = "stuffdetails")] 
    public JsonResult GetStuff() 
    { 
     return new JsonResult(new 
     { 
      Message = "You've got stuff.." 
     }); 
    } 
} 

Если удалить атрибут Авторизовать из метода GetStuff, все в порядке, потому что, как журнал показал, маркер на предъявителя разрешается.

Вопросы:

  1. ли разрешение неудачу, потому что моя политика неверна, и если это так, как она должна быть установлена?
  2. Если я хочу проверить токен, содержит правильные утверждения и был разрешен, правильно ли использовать политики, как у меня?
  3. Я делаю ошибку, пытаясь использовать UseIdentityServerAuthentication вместо UseJwtBearerAuthentication?

Любая помощь очень ценится ..

+0

Вы задаете три хороших вопроса, хотя три вопроса в одном. Подумайте о том, чтобы разбить свой вопрос на три отдельных вопроса. Сейчас он несколько широк. –

ответ

2

ли разрешение неудачу, потому что моя политика неверна, и если да, то каким он должен быть установлен?

Что вы имеете в виду правильно, но вы можете легко проверить, просто удалив часть «политики» вашего атрибута Authorize: если он теперь работает, проблема связана с вашей политикой, если она по-прежнему не работает то это более широкая проблема, чем просто ваша политика. Я предполагаю, что вы добавляете требование «stuffdetails» в свой access_token с вашей собственной реализацией IProfileService?

Если я хочу, чтобы проверить маркер содержит соответствующие требования, и авторизован, это правильно использовать политику, как у меня есть?

Да, это, по-видимому, основной способ aspnet делать пользовательскую авторизацию.

я делаю ошибку, пытаясь использовать UseIdentityServerAuthentication вместо UseJwtBearerAuthentication?

Я использую UseIdentityServerAuthentication с потоком ResourceOwnerPassword. Мне было бы интересно услышать, является ли подход UseJwtBearerAuthentication предпочтительным или предлагает другие функции.

+0

+1 Мэштон, спасибо за помощь, глядя на претензии в токене доступа, я понял, что ожидаю «stuffdetails», поэтому моя политика не работала. – jaeckyl

+0

Рад, что вы нашли проблему, и что я смог предоставить некоторые указатели, которые помогли вам туда добраться. – Mashton

1

ошибка с моей стороны было так, как я создал свою политику:

opts.AddPolicy("stuffdetails", 
          policy => policy.RequireClaim("stuffdetails")); 

Должно быть:

opts.AddPolicy("stuffdetails", 
          policy => policy.RequireClaim("scope","stuffdetails")); 

политика должна была подтвердить осциллографы включено «stuffdetails» .. Большой ресурс для любого, у кого есть проблема, является сообщением damienbod, Authorization Policies and Data Protection with IdentityServer4 in ASP.Net Cord