10

WIF 4.5 を使用して Windows 認証とクレームを使用する MVC 3 アプリがあります。

アプリケーションへのアクセスは、(現在) AD グループのメンバーシップを介して制御されます。

<deny users="?" />
<allow roles="domain\somegroup" />
<deny users="*" />

AD グループに加えて、追加する必要があるカスタム ロールがあります。(このアプリは Forms から Windows 認証に変換中です)

これらのカスタム ロールをサポートするために (AD で管理されるまで)、それらを ClaimTypes.GroupSid クレームとしてユーザーに追加し、既存のコードを利用[Authorize("ADMIN")]してUser.IsInRole("ADMIN")引き続き機能できるようにします。

Application_PostAuthenticateRequest(object sender, EventArgs e)
{
    var identity = ClaimsPrincipal.Current.Identity as WindowsIdentity;
    var roles = userDAL.GetRoles(identity.Name);
    foreach(var role in roles)
    {
        identity.AddClaim(new Claim(ClaimTypes.GroupSid, role));
    }
}

そして、これはすべて期待どおりに機能しています。

現在のユーザーがカスタム ロール (ADMIN など) のメンバーではなく、そのロールも AD に存在しない場合を除きます。

シナリオに依存する[Authorize("ADMIN")]さまざまなインスタンスと同様に、コントローラー アクション メソッドで使用します。User.IsInRole("ADMIN")エラーが発生してアプリが爆発するのは、そのような場合です。

AD インフラストラクチャはアップグレード/移行の最中です。私はそこにあるすべての詳細に精通しているわけではありませんが、いくつかのドメインがあり、それらの間に信頼関係があると思われることは知っています.インフラストラクチャの人々から、これらの信頼関係が稼働しているとほのめかされています.

だから本当に私は2つのことを疑問に思っていると思います:

  1. これは実際には、コードで処理する必要があるものとは思えません。では、ドメインの何が問題になっているのでしょうか? 信頼関係が失敗している「信頼できる」ドメインを見つけることはできますか?

  2. これを回避する最善の方法は何ですか? Authorize()この例外をトラップするためだけにヘルパー メソッドとサブクラスを作成するという考えは嫌いです。

4

2 に答える 2

2

inetmgr、サイト、既定の Web サイト、サイト名、iis グループ、ダブルクリック認証に移動し、匿名認証を無効にしてから、アプリケーション プールをリセットしてください。

これは、web.config ファイルの「authorization, allow roles」タグで定義されたロールを Windows が解読できない場合に発生するようです。テストのために、web.config ファイルからカスタム ロール タグをコメント アウトします。この問題は、フォーム認証と Windows 認証を混同した場合に発生するようです。Global.asax ファイルの Application_PostAuthenticateRequest メソッドで魔法が起こります。フォーム認証を使用する場合、User.Identity を FormsIdentity としてキャストし、FormsIdentity チケットからカスタム ID を作成し、カスタム ID からカスタム プリンシパルを作成すると、次のようになります。 CustomPrincipal を Current User および Current Principal にアタッチできます。

Dim fIdent As FormsIdentity = CType(User.Identity, FormsIdentity)
Dim ci As New CustomIdentity(fIdent.Ticket) 
Dim cp As New CustomPrincipal(ci)
HttpContext.Current.User = cp : Thread.CurrentPrincipal = cp

フォーム認証と匿名認証を有効にする IIS では、他のすべてを無効にする必要があります。Windows 認証を使用する場合、Global.asax ファイルの Application_PostAuthenticateRequest メソッドは、User.Identity から直接カスタム プリンシパルを作成できます。

Dim cp As New CustomPrincipal(User.Identity)
HttpContext.Current.User = cp : Thread.CurrentPrincipal = cp

この場合、IIS 設定は Windows 認証である必要があり、ASP.Net 偽装が有効で、他のすべてが無効になっています。

Application_PostAuthenticateRequest メソッドが何らかの理由で CustomPrinciple を実装していない場合、Windows はチェックする組み込みの IsInRole 関数を使用しようとするため、これらの認証方法を混同すると、「プライマリ ドメインと信頼できるドメインの間の信頼関係に失敗しました」というエラーが発生します。 CustomPrinciple コード ビハインド ファイルにあるカスタム IsInRole を使用する代わりに、ドメイン ロールに対するロール。

役立つ記事とリンクは次のとおりです。

http://www.codeproject.com/Articles/8819/Authorize-and-authenticate-users-with-AD https://msdn.microsoft.com/en-us/library/ff647405.aspx
https://support. microsoft.com/en-us/kb/306359

于 2015-04-23T19:49:54.020 に答える