0

데이터베이스 사용자를 Azure AD 전자 메일 주소로 인식하고 로컬 데이터베이스 사용자의 속성을 기반으로 azure AD 인증 된 사용자에게 사용자 지정 클레임을 추가하려고합니다. startup.cs에서 나는 가지고 : Azure 사용자 .net 코어에 대한 로컬 데이터베이스 기반 사용자 정의 권한 부여 추가

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); 
    }); 
    ... 
} 

그런 다음 ClaimsTransformer.cs은 다음과 같습니다

:

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; 
     } 
    } 
} 

를하지만 나에게 준다 "NullReferenceException이 :. 개체 참조가 개체의 인스턴스로 설정되지 않았습니다" at if (user.Sposti == sposti)

대신 변수 중 하나에 문자열 값을 제공하면 if 문이 올바르게 작동합니다. 내가 뭘 잘못하고 있는지 모르겠다. 비동기와 관련이 있습니까? 이게 너를 괴롭히는 걸 도와 줘.

+0

사용자 개체가 null 인 것처럼 보입니다. 비동기 최우수 사용자가 우리에게 시간을두고 돌아 오지 않을 것이기 때문일 수 있습니다. –

+0

그래, 그게 내가 의심하는 바야. 어떻게 가치를 부여 할 수 있니? –

+0

저는 비동기 프로그래밍에서 불량입니다. 그것은 장님 발사를 완료 할 것이다. 하지만 먼저 DB에 이메일이 있는지 확인해야합니다. 일단 확인되면 비동기에 대해 걱정할 필요가 있습니다. –

답변

0

문자열을 설정하기 전에 sposti = ((ClaimsIdentity)ctrans.Principal.Identity).Name;을 호출하려고했습니다. 이제 고마워요 :)