Обновленное значение Претензии не отражено в последующих запросах - PullRequest
0 голосов
/ 02 апреля 2019

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

Ниже приведен код, который я использую для хранения претензий после входа в систему:

User user = new UserManager().GetUser(UserName, Password);

var claims = new List<Claim>()
{
   new Claim(ClaimTypes.Name, user.FullName),
   new Claim(ClaimTypes.Email, user.Email),
   new Claim("IsLocked", Convert.ToString(user.IsLocked))
};

AuthenticationProperties properties = CreateProperties(context.UserName);
ClaimsIdentity oAuthIdentity = new ClaimsIdentity(claims, Startup.OAuthOptions.AuthenticationType);
var ticket = new AuthenticationTicket(oAuthIdentity, properties);
context.Validated(ticket);

Как вы можете видеть в приведенном выше коде, у меня есть претензия на сохранение IsLocked значения пользователя. Согласно требованию, мне нужно запретить доступ к каждому действию API от пользователей, чья учетная запись заблокирована. Для этого я создал фильтр настраиваемых действий, и внутри него я использую значение IsLocked претензия и таким образом предотвращаю выполнение действий, если значение претензии пользователя говорит о том, что учетная запись пользователя заблокирована.

Ниже приведен код моего фильтра пользовательских действий:

public class AllowActiveUsersAttribute : ActionFilterAttribute
{
    public AllowActiveUsersAttribute()
    {

    }

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        var identity = (ClaimsPrincipal)Thread.CurrentPrincipal;

        if (Convert.ToBoolean(identity.Claims.Where(c => c.Type == "IsLocked").Select(c => c.Value).SingleOrDefault()))
        {
            actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
        }
    }
}

И затем я использую этот пользовательский атрибут для всех действий веб-API, например:

[AllowActiveUsers]
public async Task<IHttpActionResult> GetAccountDetails()

Этот код работает отлично, и я получаю несанкционированную ошибку, когда я вхожу в систему с заблокированной учетной записью, а затем пытаюсь использовать любую конечную точку API.

В нашей системе есть некоторые правила, и нарушение этих правил может заблокировать учетную запись пользователя. Когда учетная запись блокируется, пользователь не должен иметь доступ к какой-либо конечной точке API. Поэтому после успешного входа в систему (с учетной записью, которая не заблокирована), если пользователь нарушает какое-либо правило, его учетная запись должна быть немедленно заблокирована, и после этого он / она не должен иметь возможности использовать какие-либо конечные точки API.

Для этого я добавил код для обновления значения IsLocked претензии, и он успешно обновляет значение претензии. Но когда я пытаюсь получить значение IsLocked в пользовательском действии, тогда я получаю то же самое старое значение вместо нового возвращаемого значения. Ниже приведен код, который я использую для обновления значения претензии.

// check for the existing claim and remove it
var user = User as ClaimsPrincipal;
var identity = user.Identity as ClaimsIdentity;
var claim = (from c in user.Claims where c.Type == "IsLocked" select c).FirstOrDefault();
if (claim != null)
    identity.RemoveClaim(claim);

// add new claim
identity.AddClaim(new Claim("IsLocked", Convert.ToString(true)));
var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;
authenticationManager.AuthenticationResponseGrant = new AuthenticationResponseGrant(new ClaimsPrincipal(identity), new AuthenticationProperties() { IsPersistent = true });

Подскажите, пожалуйста, как я могу получить новое значение в настраиваемом атрибуте, чтобы в случае блокировки учетной записи пользователя при последующих запросах не обрабатывался ни один из запросов API?

1 Ответ

0 голосов
/ 02 апреля 2019

Это потому, что вы все еще используете старый / существующий токен, который все еще не имеет обновленное значение IsLocked и, следовательно, сценарий. Чтобы решить эту проблему, либо пользователь должен начать заново, сгенерировав новый токен, который будет иметь обновленное значение. По сути, новый токен доступа должен быть сгенерирован.

См. Ссылку на эту проблему для более глубокого понимания https://github.com/IdentityServer/IdentityServer3/issues/2783

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...