Аутентификация токена носителя и смена пароля

Сейчас я нахожусь на этапе изучения аутентификации токена носителя в веб-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);
        }

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

  1. Аутентификация токена основана на сгенерированном токене. Я создал токен для своего пользователя с ролью «Администратор». Теперь я могу получить доступ к ограниченному действию, поскольку у пользователя есть роль «Администратор». Но после этого я изменил роль на «Пользователь» для того же старого пользователя. Теперь с тем же старым токеном я могу получить доступ к ресурсу, даже если он сейчас не в «Администраторе». На самом деле я читал некоторые статьи о том, что это реализовано с дополнительной пользовательской логикой. Ничего страшного

  2. Теперь я изменил пароль пользователя на другой пароль. Теперь я могу получить доступ к ресурсу с тем же старым токеном. Я думаю, что это нехорошо, даже если я создаю недолговечные токены.

Кто-нибудь, пожалуйста, помогите арестовать это, или я что-то пропустил? Какой метод на самом деле вызывается, когда я вызываю действие с заголовком «Авторизация»


person Akhil    schedule 23.10.2014    source источник


Ответы (1)


Что ж, нет «прямого» способа отозвать предоставленные токены доступа или выполнить «выход из системы». если у пользователя есть токен, он может получить доступ к защищенным ресурсам сервера, пока не истечет срок действия токена. Косвенный способ заключается в том, чтобы хранить token_id для каждого токена, предоставленного пользователю, в базе данных и выполнять проверки БД при каждом вызове, чего я не рекомендую.

Поэтому в некоторых ситуациях лучше использовать токены обновления вместе с токеном доступа. Таким образом, вы выдаете краткосрочный токен доступа (15) минут и используете токен обновления для получения новых токенов доступа. Хорошая вещь здесь в том, что токены обновления могут быть отозваны из серверной системы, поэтому над ними есть контроль.

Посмотрите мой пост о том, как включить OAuth обновить токены в веб-API ASP.NET

person Taiseer Joudeh    schedule 25.10.2014
comment
привет Тайсер, спасибо. Я уже прочитал все ваши статьи, касающиеся этого, и только из этого я понял, что через токен обновления можно сделать только это. Я просто попросил здесь любой альтернативный вариант, потому что, хотя токен обновления составляет 15 минут, любые изменения в течение 15 минут не могут быть обработаны. просто для очистки - person Akhil; 27.10.2014