По общему признанию, это первый удар при создании проекта 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, все в порядке, потому что, как журнал показал, маркер на предъявителя разрешается.
Вопросы:
- ли разрешение неудачу, потому что моя политика неверна, и если это так, как она должна быть установлена?
- Если я хочу проверить токен, содержит правильные утверждения и был разрешен, правильно ли использовать политики, как у меня?
- Я делаю ошибку, пытаясь использовать UseIdentityServerAuthentication вместо UseJwtBearerAuthentication?
Любая помощь очень ценится ..
Вы задаете три хороших вопроса, хотя три вопроса в одном. Подумайте о том, чтобы разбить свой вопрос на три отдельных вопроса. Сейчас он несколько широк. –