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つのことを疑問に思っていると思います:
これは実際には、コードで処理する必要があるものとは思えません。では、ドメインの何が問題になっているのでしょうか? 信頼関係が失敗している「信頼できる」ドメインを見つけることはできますか?
これを回避する最善の方法は何ですか?
Authorize()
この例外をトラップするためだけにヘルパー メソッドとサブクラスを作成するという考えは嫌いです。