1

ASP.NET Core 2.0을 사용하여 서비스 패브릭의 상태 비 저장 웹 응용 프로그램을 개발 중입니다. 이 응용 프로그램은 Azure AD를 사용하여 여러 AD 테넌트의 사용자를 인증합니다. 내가 성취하고자하는 것은 권한있는 사용자를 사용하여 응용 프로그램에서 구성 할 수있는 자신의 역할 기반 권한 부여를 사용하는 것입니다. 이러한 역할은 내 응용 프로그램에 저장됩니다.Azure AD 인증을 사용한 사용자 지정 인증

내 현재 구현에서는 사용자 정의 IAuthorizationRequirement과 함께 정책을 추가하여 응용 프로그램에 권한을 추가합니다. 요구 사항의 권한 부여 중에 사용자 권한에 따라 권한이 추가됩니다. 즉, 클레임은 로그인 후 추가됩니다. 역할 클레임이 로그인 후 추가되어 있기 때문에 [Authorize(Roles = "role")] 속성도 작동하지 않습니다.

Azure AD의 인증 된 사용자를 사용하는이 사용자 지정 인증을 구현하는 올바른 방법은 무엇입니까?

+0

로그인 할 때 왜 추가하지 않으시겠습니까? – juunas

+0

@juunas 그게 목표입니다. 그러나 Azure AD가 인증에 사용되므로 구현 방법을 잘 모릅니다. –

+0

Gotcha, 나는 곧 그 일을하는 법을 보여주는 답을 쓸 것입니다 :) – juunas

답변

1

당신은 OnTokenValidated 이벤트를 통해에 사용자가 로그인 한 후 자신 만의 주장을 추가 할 수 있습니다

.AddOpenIdConnect(o => 
{ 
    Configuration.GetSection("OpenIdConnect").Bind(o); 
    o.Events = new OpenIdConnectEvents 
    { 
     OnTokenValidated = async ctx => 
     { 
      string oid = ctx.Principal.FindFirstValue("http://schemas.microsoft.com/identity/claims/objectidentifier"); 

      var db = ctx.HttpContext.RequestServices.GetRequiredService<AuthorizationDbContext>(); 

      var objectIdGuid = Guid.Parse(oid); 
      bool isSuperAdmin = await db.SuperAdmins.AnyAsync(a => a.ObjectId == objectIdGuid); 
      if (isSuperAdmin) 
      { 
       var claims = new List<Claim>(); 
       claims.Add(new Claim(ClaimTypes.Role, Roles.SuperAdmin)); 
       var appIdentity = new ClaimsIdentity(claims, "MyTestAppIdentity"); 

       ctx.Principal.AddIdentity(appIdentity); 
      } 
     } 
    }; 
}); 

을 여기에 우리가 사용자가 최고 관리자인지 여부를 데이터베이스에서 확인 예로. 그렇다면 우리는 주장으로서 필요한 역할을 가진 그들에 대한 새로운 정체성을 창조합니다.

모든 신원 정보는 원칙에 따라 결합되어 소유권 주장 집합을 작성하므로 다른 모든 주장도 계속 사용할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 나는 그것을 구현하려했지만, 현재'.AddAzureAd' 메소드를 사용하여 Azure AD 인증을 구현한다. 이 메소드는 또한 OpenIdConnect를 사용하기 때문에 예외가 발생합니다 :'System.InvalidOperationException : 'Scheme already exists : OpenIdConnect''. 이 예외는'.AddAzureAd'와'.AddOpenIdConnect'를 사용할 때 발생합니다. 이 문제에 대한 해결책을 알고 있습니까? –

+0

AddAzureAd 처리기 내에 이벤트 처리 코드를 구현해야합니다. 다른 OIDC 처리기를 추가 할 수 없습니다. – juunas

+0

AzureAdOptions은 OpenIdConnectOptions과 다릅니다. 이벤트 속성이 없습니다. AddAzureAd 메서드는 내부적으로 OIDC 옵션을 사용하지만 이러한 클래스는 개인 클래스에 정의되어 있습니다. AddAzureAd 메서드에서 이벤트 처리 코드를 어떻게 구현합니까? –

관련 문제