在 IAuthenticationService.SignInSync 之后无法立即读取身份声明

问题描述

我有一种这样的登录方法,我添加了三个声明,其中一个自定义声明

public async Task SignInAsync(IUser user)
{
    var claims = new List<Claim>
    {
        new Claim(ClaimTypes.NameIdentifier,user.Id.ToString("N")),new Claim(ClaimTypes.Name,$"{user.FirstName} {user.LastName}"),new Claim(ClaimsPrincipalHelper.LoginSessionIdClaimsType,Guid.NewGuid().ToString())
    };

    var identity = new ClaimsIdentity(claims,DefaultAuthenticationTypes.ApplicationCookie);
    var principal = new ClaimsPrincipal(identity);
    var properties = new AuthenticationProperties
    {
        AllowRefresh = true,IsPersistent = true,ExpiresUtc = DateTime.UtcNow.AddDays(7)
    };

    await _authenticationService.SignInAsync(_context,CookieAuthenticationDefaults.AuthenticationScheme,principal,properties);
}

我的理解是,只要调用方法,就可以获取声明,因此基本上在此行之后

await SignInAsync(user);

我什么时候会立即这样做

var claims = HttpContext.User.Claims.ToList();

所有三个声明都应该可用。但事实并非如此,当我立即执行时,它返回零声明,但是当我在一段时间后尝试访问声明时,我得到了所有三个声明。

那么是cookie编写需要时间还是什么? 为什么不能立即获得索赔或我的理解有误?

解决方法

您的自定义声明必须实现 IClaimsTransformation 接口和 TransformAsync 函数,这会被 ASP 自动调用。然后需要将其添加到 Startup.cs 类中的应用服务集合中,现在您就可以访问它了。

第 1 步:为您的.. IClaimsTransformation 实现接口 MyCustomClaim

第 2 步:在您的服务集合中注册 services.AddScoped<IClaimsTransformation,MyCustomClaim>();

两者都需要,否则它会返回 null,这是一个很好的 ref

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...