1

ASP.NET Core 2.0を使用してサービスファブリックのステートレスWebアプリケーションを開発しています。このアプリケーションは、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メソッドでイベント処理コードをどのように実装しますか? –