Asp net Identity 2.0 токен на предъявителя и ошибки ролей - PullRequest
0 голосов
/ 10 сентября 2018

Как настроить ответ об ошибке, когда у пользователя нет роли, но есть токен на предъявителя?

По умолчанию 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"
}
...