5

私はOpenIddict for token authenticationを使用しています。昨日私がuserManager.FindByNameAsync(request.Username)と呼ぶとき、私は役割を持つユーザーを得ます。
今日、私は私がawait userManager.GetRolesAsync(user);と役割をロードしようと、私は、ユーザーが役割を有することを意味する数3の配列を取得= 0userManager.FindByNameはロールを返しません

役割のプロパティ数を持つユーザーを取得します。

私は何が変更されたかわかりませんが、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

関連する問題