認証パートを作成するSTSを作成しました。カスタムメンバーシッププロバイダを使用します。 ログインに成功すると、自分のRPのWebサイトにリダイレクトされます。すべて認証の面では問題ありません。Windows Identity FoundationでカスタムRoleProviderを使用する - STS
私はRP Webサイトのweb.configで定義されたCustomRolesProviderを定義しました。 STSから返されたユーザー名を使用して、RPのデータベースからそのユーザーのロールをフェッチします。 Roles.GetRolesForUserを使用すると、適切な役割を果たします。
管理者だけが管理者フォルダにアクセスできるようにするには、自分のRPのweb.configに次のように記述します。
そして、サイトマッププロバイダは=「true」を
<location path="admin">
<system.web>
<authorization>
<allow roles="admin" />
<deny users="*" />
</authorization>
</system.web>
</location>
<add name="default" type="System.Web.XmlSiteMapProvider" siteMapFile="Web.sitemap" securityTrimmingEnabled="true" />
問題securityTrimmingEnabledました: ユーザーが管理者の役割である場合には、管理ページのメニュータブが見せつけるませんが。 Roles.IsUserInRole( "admin")がtrueを返すことを確認しました。ロールはロールプロバイダによって認識されますが、web.configの認可ルールとサイトマッププロバイダでは認識されません。
web.configから「場所」をコメントアウトすると、ログインしているすべてのユーザーに管理者フォルダを許可すると、メニュー項目が正常に表示されます。
RPは自分自身の役割の実装を持つことができ、STSの役割クレームに依存する必要はありません。
誰にもアイデアはありますか?
アップデート2(2012年1月20日): IはSTSの役割を返すことは、以下のように主張することがわかっ:
http://schemas.microsoft.com/ws/2008/06/identity/claims/role = Manager
だからが変更された場合<allow roles="admin" /> to <allow roles="Manager" />
ロールがピックアップされ、メニュータブが適切に示されています。
私は、私の役割をどのように利用するかについてのリンクがなく、クレームによって返されたものではないと確信しています。
アップデート2(2012年1月20日): それが動作する以下のように私はclaimsIdentityに役割を追加する場合:
void Application_AuthenticateRequest(object sender, EventArgs e) {
if (Request.IsAuthenticated) {
IClaimsPrincipal claimsPrincipal = HttpContext.Current.User as IClaimsPrincipal;
IClaimsIdentity claimsIdentity = (IClaimsIdentity)claimsPrincipal.Identity;
if (!claimsIdentity.Claims.Exists(c => c.ClaimType == ClaimTypes.Role))
{
claimsIdentity.Claims.Add(new Claim(ClaimTypes.Role, "admin"));
}
}
}
をしかし、その後、何がそのコードを追加するのに最適な場所でしょうか? Application_AuthenticateRequestに追加すると、リクエストごとに追加され、追加が続けられます。 (私はif文を追加することによって、これを固定)
* アップデート3(2012年1月24日):役割を得るために、私CustomRoleProviderを使用し、その後にそれを追加私のコードの *バージョン2 ClaimsCollection:
しかし、それが正しいかどうかはわかりません。
このようなことをした人はいますか?
更新4(2012年1月26日):私は自分の主張を変換するためにCustom ClaimsAuthencationManager(ステップ4)を使用することができることを見出しました。 Global.asaxのAuthenticateRequestメソッドのコードをClaimsAuthenticationManagerクラスのAuthenticateメソッドに移動しました。
これよりも優れているかどうかは疑問です。答えとして私の解決策を掲載します。しかし、誰かが他のより良い解決策を持っていれば、コメントを自由にすることができます。
問題は、特定のRPによってロールが追加されていることです。別のソリューションは、カスタムSTSに追加することですが、カスタムSTSはその情報にアクセスする必要があります。複数のRPが役割情報を知る必要がある場合は、これが優れたソリューションになります。 – Kaido
状況に応じて、STSが認識している役割を持つことは正しくない可能性があります。たとえば、GoogleやMSNをSTSとして使用している場合、GoogleとMSNはRPの役割について知っている必要がありますか?または、Active Directoryドメイン内でADFSを使用している場合は、ADFSにユーザーの役割を提供させることができます。役割は、ADグループまたはASPデータベースから来る可能性があります。 –
@ Phil:ありがとう、私はSecurityTokenValidatedイベントを調べ、私のRPの1つで試してみます。別のRPのロールは、どのクライアントプログラムユーザーが選択するかに基づいて更新されます。その場合、私はそれぞれのリクエストでそれらをチェックする必要があります。 – gbs