Как настроить ответ об ошибке, когда у пользователя нет роли, но есть токен на предъявителя?
По умолчанию Identity 2.0 отправляет идентичный ответ, когда у пользователя нет токена и роли.
Скажите, пожалуйста, какие методы я должен переопределить, чтобы решить эту проблему.
Я использую Asp net Web Api 2.0.
Заголовки запроса:
content-type: application/json
accept: application/json
authorization: bearer {token_value}
Заголовки ответа:
cache-control: no-cache
pragma: no-cache
content-type: application/json; charset=utf-8
expires:-1
server: Microsoft-IIS/10.0
x-aspnet-version: 4.0.30319
www-authenticate: Bearer
x-sourcefiles:
=?UTF-8?B?RDpcUHJvamVjdCBWUzE3XEJveGluZ0FwcFxBcHBCb3hpbmdcQXBwQm94aW5nXGFwaVxWYWx1ZXNcVXNlcg==?=
x-powered-by: ASP.NET
date: Tue, 11 Sep 2018 20:08:14 GMT
content-length: 61
{"Message":"Authorization has been denied for this request."}
Ответы идентичны, если у пользователя нет роли или токена.Код ответа: 401
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();
var roleManager = context.OwinContext.GetUserManager<ApplicationRoleManager>();
ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password);
if (user == null)
{
context.SetError("invalid_grant", "The user name or password is incorrect.");
return;
}
ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager,
OAuthDefaults.AuthenticationType);
String roles = String.Empty;
foreach (var roleClaim in user.Roles)
{
ApplicationRole rol = null;
rol = roleManager.FindById(roleClaim.RoleId);
if (rol != null)
roles += rol.Name + ", ";
}
AuthenticationProperties properties = CreateProperties(user.UserName, roles.ToString());
AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
context.Validated(ticket);
}
Контроллер:
[HttpPost]
[Authorize(Roles ="Admin")]
[HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)]
[Route("Admin")]
public String ForAdmin()
{
return "Only Admin";
}
Маркер ответа:
{
"access_token": "{token_value}",
"token_type": "bearer",
"expires_in": 299,
"refresh_token": "{refresh_token}",
"userName": "{user_name}",
"roles": "Default",
".issued": "Tue, 11 Sep 2018 20:32:27 GMT",
".expires": "Tue, 11 Sep 2018 20:37:27 GMT"
}