В моем проекте я использую аутентификацию на основе токена, и после успешного входа в систему я сохраняю некоторые пользовательские значения в токене пользователя, и для этого я использовал утверждения.
Ниже приведен код, который я использую для хранения претензий после входа в систему:
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?