强制另一个用户使用 ASP.NET Identity 2.1.0 刷新他们的声明

Force another user to refresh their Claims with ASP.NET Identity 2.1.0

我正在使用 Asp.NET Identity 2.1.0 并且我存储了 User 可以访问的 Accounts 的列表,作为声明。当User登录时生成ClaimsIdentity

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
    var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);

    // Add Claims concerning Account
    userIdentity.AddClaim(new Claim("AccountList", SerializedListOfAccounts));

    return userIdentity;
}

假设管理员撤销了 User A 对特定帐户的访问权限。我怎样才能强制 User A 重新生成它的 ClaimsIdentity?请记住,它不在 User A 的上下文中。而且我不想等到 cookie 过期(并自动生成一个新的 ClaimsIdentity

可能吗?有没有办法告诉服务器将 User A 的 cookie 视为无效并强制重新生成它?

我想要这种行为的原因是创建一个自定义 AuthorizeAttribute,我可以将其放在我的控制器上,检查 Claims 以查看 User 是否具有访问权限,以避免额外的数据库往返。

您不能将它们的声明存储在 cookie 上,而是将它们应用于管道早期对身份的每个请求。您必须破解 Startup.Auth.cs 才能做到这一点。我正在这样做 here

这是您可以使用的要点:

public partial class Startup
{
    public void ConfigureAuth(IAppBuilder app)
    {
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            Provider = GetMyCookieAuthenticationProvider(),
            // other configurations
        });

        // other usual code
    }



    private static CookieAuthenticationProvider GetMyCookieAuthenticationProvider()
    {
        var cookieAuthenticationProvider = new CookieAuthenticationProvider();
        cookieAuthenticationProvider.OnValidateIdentity = async context =>
        {
            // execute default cookie validation function
            var cookieValidatorFunc = SecurityStampValidator.OnValidateIdentity<UserManager, ApplicationUser>(
                TimeSpan.FromMinutes(10),
                (manager, user) =>
                {
                    var identity = manager.GenerateUserIdentityAsync(user);
                    return identity;
                });
            await cookieValidatorFunc.Invoke(context);

            // sanity checks
            if (context.Identity == null || !context.Identity.IsAuthenticated)
            {
                return;
            }


            // get your claim from your DB or other source
            context.Identity.AddClaims(newClaim);
        };
        return cookieAuthenticationProvider;
    }
}

您需要对每个请求应用声明的缺点,这可能不是很高效。但是在正确的位置进行适量的缓存会有所帮助。此外,这段代码并不是最容易工作的地方,因为它处于管道的早期阶段,您需要自己管理 DbContext 和其他依赖项。

优点是声明会立即应用于每个用户的请求,您无需重新登录即可立即更改权限。