0

J'essaie de reconnaître l'utilisateur de base de données avec l'adresse e-mail Azure AD, puis d'ajouter une réclamation personnalisée à l'utilisateur Azure AD authentifié. En startup.cs je suis arrivé:Ajout d'une revendication d'autorisation personnalisée basée sur la base de données locale pour l'utilisateur Azure .net core

public void ConfigureServices(IServiceCollection services) 
{ 
    ... 
    services.AddScoped<IClaimsTransformer, ClaimsTransformer>(); 
    ... 
} 

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, KayttajatContext context) 
{ 
    ... 
    app.UseClaimsTransformation(async (c) => 
    { 
     IClaimsTransformer transformer = c.Context.RequestServices.GetRequiredService<IClaimsTransformer>(); 
     return await transformer.TransformAsync(c); 
    }); 
    ... 
} 

Alors ClaimsTransformer.cs ressemble à ceci:

namespace Authtest 
{ 
    public class ClaimsTransformer : IClaimsTransformer 
    { 

     private readonly KayttajatContext _context; 

     public ClaimsTransformer(KayttajatContext dbContext) 
     { 
      _context = dbContext; 
     } 

     public async Task<ClaimsPrincipal> TransformAsync(ClaimsTransformationContext ctrans) 
     { 

      string sposti = ((ClaimsIdentity)ctrans.Principal.Identity).Name; 
      var user = await _context.Henkilöt.FirstOrDefaultAsync(t => t.Sposti == sposti); 

      if (user.Sposti == sposti) 
      { 
       ((ClaimsIdentity)ctrans.Principal.Identity).AddClaim(new Claim(ClaimTypes.Role, "Administrator")); 
       ((ClaimsIdentity)ctrans.Principal.Identity).AddClaim(new Claim(ClaimTypes.Role, "User")); 
      } 
      else 
      { 
       ((ClaimsIdentity)ctrans.Principal.Identity).AddClaim(new Claim(ClaimTypes.Role, "User")); 
      } 
      return ctrans.Principal; 
     } 
    } 
} 

Mais cela me donne "NullReferenceException: objet de référence non définie à une instance d'un objet." Si je donne à la place une valeur de chaîne à l'une ou l'autre des variables, si l'instruction fonctionne correctement. Je ne sais pas ce que je fais mal? Est-ce que ça a quelque chose à voir avec async? S'il vous plaît aidez-moi cela me rend fou.

+0

On dirait que l'objet utilisateur est null. Peut-être parce que l'async firstordefault nous ne revenons pas à temps. –

+0

Ouais c'est ce que je soupçonne aussi, comment puis-je m'assurer qu'il donne une valeur? –

+0

Je suis un pauvre type en programmation asynchrone. Cela compléterait le tir aveugle. Mais vous devez d'abord vous assurer que la base de données contient cet email. Une fois que cela est confirmé, vous devez vous inquiéter de l'async. –

Répondre

0

J'essayais d'appeler la chaîne sposti = ((ClaimsIdentity)ctrans.Principal.Identity).Name; avant qu'elle ne soit définie. Fonctionne maintenant, merci :)