Сейчас я нахожусь на этапе изучения аутентификации токена носителя в веб-API. Код реализован с аутентификацией на основе токенов и файлов cookie. Код
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
try
{
using (UserManager<ApplicationUser> userManager = userManagerFactory())
{
ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password);
if (user == null || user.IsDeleted)
{
context.SetError("invalid_grant", "The user name or password is incorrect.");
return;
}
ClaimsIdentity oAuthIdentity = await userManager.CreateIdentityAsync(user,
context.Options.AuthenticationType);
ClaimsIdentity cookiesIdentity = await userManager.CreateIdentityAsync(user,
CookieAuthenticationDefaults.AuthenticationType);
var roleName = await GetRoleName(user.Roles.First().RoleId);
AuthenticationProperties properties = CreateProperties(user.UserName, roleName);
AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
context.Validated(ticket);
context.Request.Context.Authentication.SignIn(cookiesIdentity);
}
}
catch (Exception ex)
{
throw ex;
}
}
public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
// Resource owner password credentials does not provide a client ID.
if (context.ClientId == null)
{
context.Validated();
}
return Task.FromResult<object>(null);
}
public override Task ValidateClientRedirectUri(OAuthValidateClientRedirectUriContext context)
{
if (context.ClientId == _publicClientId)
{
Uri expectedRootUri = new Uri(context.Request.Uri, "/");
if (expectedRootUri.AbsoluteUri == context.RedirectUri)
{
context.Validated();
}
}
return Task.FromResult<object>(null);
}
Код реализован коллегой, и у меня есть некоторые сомнения.
Аутентификация токена основана на сгенерированном токене. Я создал токен для своего пользователя с ролью «Администратор». Теперь я могу получить доступ к ограниченному действию, поскольку у пользователя есть роль «Администратор». Но после этого я изменил роль на «Пользователь» для того же старого пользователя. Теперь с тем же старым токеном я могу получить доступ к ресурсу, даже если он сейчас не в «Администраторе». На самом деле я читал некоторые статьи о том, что это реализовано с дополнительной пользовательской логикой. Ничего страшного
Теперь я изменил пароль пользователя на другой пароль. Теперь я могу получить доступ к ресурсу с тем же старым токеном. Я думаю, что это нехорошо, даже если я создаю недолговечные токены.
Кто-нибудь, пожалуйста, помогите арестовать это, или я что-то пропустил? Какой метод на самом деле вызывается, когда я вызываю действие с заголовком «Авторизация»