7

我正在使用OpenIddict 进行令牌身份验证。昨天当我打电话时,userManager.FindByNameAsync(request.Username)我得到了具有角色的用户。
今天我得到了 Roles 属性 count = 0 的用户。

我尝试加载角色,await userManager.GetRolesAsync(user);并得到计数为 3 的数组。这意味着用户具有角色。

我不知道发生了什么变化,但是如何使用 FindByNameAsync 函数加载具有角色的用户?

完整代码:

[HttpPost("token"), Produces("application/json")]
public async Task<IActionResult> Exchange(OpenIdConnectRequest request)
{
    Debug.Assert(request.IsTokenRequest(),
        "The OpenIddict binder for ASP.NET Core MVC is not registered. " +
        "Make sure services.AddOpenIddict().AddMvcBinders() is correctly called.");

    if (request.IsPasswordGrantType())
    {
        var user = await userManager.FindByNameAsync(request.Username);  //roles count is 0
        if (user == null)
        {
            return BadRequest(new OpenIdConnectResponse
            {
                Error = OpenIdConnectConstants.Errors.InvalidGrant,
                ErrorDescription = "The email/password couple is invalid."
            });
        }
        var roles = await userManager.GetRolesAsync(user);  //roles count is 3
4

1 回答 1

7

但是如何使用 FindByNameAsync 函数加载具有角色的用户?

你不能(至少没有实现你自己的IUserStore)。

在底层,默认的 ASP.NET Core Identity 存储实现(基于 EF)不会出于性能原因急切地加载与用户实体关联的导航属性,这就是Roles未填充该属性的原因。

要加载与用户关联的角色,请使用UserManager.GetRolesAsync(user);.

于 2017-02-13T08:13:44.803 回答