c# - 如何更新 OWIN CookieAuthenticationProvider 中的声明?

标签 c# asp.net cookies owin

在使用 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 重新声明自身吗?我不想让用户退出以更新声明——事实上我真的只使用声明作为存储,因为我不知道在这种情况下我还能使用什么(与 Controller 方法相反)。有更好的方法吗?最后,我要做的是将 cookie 过期与写入 cookie 的更新 API token 同步。

最佳答案

我知道这可能有点晚了,但我发现如果您再次让用户登录,旧声明将被新声明替换。所以你的案例看起来像这样。

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.Request.Context.Authentication.SignIn(newIdentity);
        }               
    }

    return Task.FromResult<object>(null);
}

关于c# - 如何更新 OWIN CookieAuthenticationProvider 中的声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39782120/

相关文章:

c# - 有没有办法从 DataContract 导出 XSD 架构

c# - 带有 Npgsql 的 Entity Framework 6

c# - 无法从 asp.net 应用程序中关闭的 TextReader 表达式中读取内容

asp.net - 无法加载文件或程序集 'Microsoft.SqlServer.DTSRuntimeWrap'

c# - 我如何使用类库的 App.config 中的连接字符串?

c# - 有没有比在开头使用 1=1 更好的动态构建 SQL WHERE 子句的方法?

c# - 以_开头的变量名是什么意思?

javascript - 在Javascript中获取Java设置的cookie

php - jQuery - 保存/使用cookie

php - 用户何时发送 cookie?