【问题标题】:How can you update claims in OWIN CookieAuthenticationProvider?如何更新 OWIN CookieAuthenticationProvider 中的声明?
【发布时间】: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 令牌同步。

【问题讨论】:

    标签: c# asp.net cookies owin


    【解决方案1】:

    我知道这可能有点晚了,但我发现如果您再次登录用户,旧的声明就会被新的声明取代。所以你的情况应该是这样的。

    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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-26
      • 2016-10-22
      • 1970-01-01
      • 2017-04-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-05
      • 2015-04-05
      相关资源
      最近更新 更多