5

Ich verwende OpenIddict for token authentication. Gestern, wenn ich userManager.FindByNameAsync(request.Username) anrufen, bekomme ich Benutzer mit Rollen. Ich
Heute erhalten Benutzer mit Rollen Eigenschaft count = 0.userManager.FindByName gibt keine Rollen zurück

Ich habe versucht, Rollen mit await userManager.GetRolesAsync(user); zu laden und ich Array mit Zahl 3. Das bedeutet, Benutzerrollen hat.

Ich weiß nicht, was sich verändert, aber wie kann ich Benutzer laden mit Rollen mit FindByNameAsync Funktion?

kompletter Code:

[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 

Antwort

6

aber wie kann ich Benutzer mit Rollen mit FindByNameAsync Funktion laden?

Sie können nicht (zumindest nicht ohne eigene IUserStore implementieren).

Unter der Haube lädt die standardmäßige ASP.NET Core Identity-Store-Implementierung (basierend auf EF) nicht aus Gründen der Performance die Navigationseigenschaften der Benutzerentität, weshalb die Roles-Eigenschaft nicht aufgefüllt ist.

die Rollen mit einem Benutzer zugeordnet zu laden, verwenden UserManager.GetRolesAsync(user);.

+0

Warum kann ich nicht geben Sie einfach .INCLUDE (Ansprüche) usw. und GET IT TATSÄCHLICH WOW – Hristo

+0

Ich glaube nicht, Beleidigungen sind notwendig, um Ihre Meinung zu äußern. Wenn Sie die Erweiterung "Include" verwenden möchten, müssen Sie einen eigenen Speicher erstellen (der vom offiziellen EF-Speicher abgeleitet werden kann) und die Methoden überschreiben, die eine Benutzerinstanz zurückgeben. – Pinpoint

+0

Es ist einfach völlig schade erstellt. Sie erhalten die Hälfte Ihrer Eigenschaften in irgendeiner Weise - die Hälfte der anderen. Wer hat gedacht, dass diese Idee gut ist? Performance? Du erhältst keine Leistung, wenn du der Hälfte deiner Entwicklergemeinde Krebs gibst – Hristo