【发布时间】:2017-02-08 11:27:00
【问题描述】:
在使用 OWIN 管道的 ASP.NET 应用程序中,我尝试使用 cookie 身份验证并覆盖 CookieAuthenticationProvider.ValidateIdentity 并执行类似的操作:
public override Task ValidateIdentity(CookieValidateIdentityContext context) {
Claim simpleClaim = context.Identity.FindFirst("SIMPLECOUNT");
if (simpleClaim != null) {
Trace.WriteLine($"SIMPLECOUNT: {simpleClaim.Value}");
if (context.Identity.TryRemoveClaim(simpleClaim)) {
var newIdentity = new ClaimsIdentity(context.Identity);
int newcount = 1 + int.Parse(simpleClaim.Value);
newIdentity.AddClaim(new Claim("SIMPLECOUNT", newcount.ToString()));
context.ReplaceIdentity(newIdentity);
}
}
return Task.FromResult<object>(null);
}
实际上,我正在更新其他声明,并且只是偶尔这样做。但这突出了主要的混乱。我可以调用 context.RejectIdentity(),也可以调用 context.ReplaceIdentity()。据推测,如果我称其为“拒绝”,那么旧的 ClaimsIdentity 将被淘汰。因此,如果我在擦除旧的声明值后重复替换一个 ClaimsIdentity,并用递增的值添加回声明,我希望 永远不会再看到旧值.
但事实并非如此。相同的值不断返回。通过使用 cookie 超时设置,我可以看到,一旦 cookie 由于滑动过期而被替换,最终会显示一个递增的声明值。新值在哪里被“排队”并最终更新?
至于重复出现的旧值,这是来自浏览器的 cookie 重新声明自身吗?我不想让用户退出来更新声明——事实上,我只是认真地使用声明作为存储,因为我不知道在这种情况下我还能使用什么(与控制器方法相反)。有更好的方法吗?最终,我要做的是将 cookie 过期时间与写入 new cookie 的更新 API 令牌同步。
【问题讨论】: