5

我正在使用OpenIddict for token authentication。昨天當我打電話給userManager.FindByNameAsync(request.Username)時,我得到了具有角色的用戶。
今天我與角色屬性計數用戶= 0userManager.FindByName不返回角色

我試圖與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 

回答

6

但如何我可以加載帶有FindByNameAsync功能角色的用戶?

你不能(至少不能實施你自己的IUserStore)。

在引擎蓋下,出於性能原因,缺省的ASP.NET Core Identity存儲實現(基於EF)並不急於加載與用戶實體關聯的導航屬性,這就是爲什麼Roles屬性未被填充的原因。

要加載與用戶關聯的角色,請使用UserManager.GetRolesAsync(user);

+0

爲什麼我不能直接輸入.Include(索賠)等,並且實際得到它哇 – Hristo

+0

我不認爲侮辱是必要的來表達您的意見。如果你想使用'Include'擴展名,你必須創建你自己的商店(可以從EF官方商店派生)並覆蓋返回用戶實例的方法。 – Pinpoint

+0

這只是完全創建。你以某種方式檢索你的一半屬性 - 一半是另一半。誰認爲這個想法很好!性能?當您將癌症交給開發社區的一半時,您將無法獲得性能 – Hristo

相關問題