2012-01-20 12 views
3

認証パートを作成する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メソッドに移動しました。

これよりも優れているかどうかは疑問です。答えとして私の解決策を掲載します。しかし、誰かが他のより良い解決策を持っていれば、コメントを自由にすることができます。

答えて

3

カスタムClaimsAuthencationManagerを使用できますが、リクエストごとに呼び出されます。私のお勧めはWSFederationAuthenticationModule.SecurityTokenValidatedです。 SecurityTokenValidatedEventArgsクラスのClaimsPrincipalプロパティを使用し、プロバイダを使用してロールを追加します。また、ロールクレームタイプをハードコーディングする代わりに、ClaimsIdentity.RoleClaimTypeを使用することもできます。

ルックアップされたロールは暗号化されたクッキーに保存されます(デフォルトを使用していると仮定します)。

+0

問題は、特定のRPによってロールが追加されていることです。別のソリューションは、カスタムSTSに追加することですが、カスタムSTSはその情報にアクセスする必要があります。複数のRPが役割情報を知る必要がある場合は、これが優れたソリューションになります。 – Kaido

+0

状況に応じて、STSが認識している役割を持つことは正しくない可能性があります。たとえば、GoogleやMSNをSTSとして使用している場合、GoogleとMSNはRPの役割について知っている必要がありますか?または、Active Directoryドメイン内でADFSを使用している場合は、ADFSにユーザーの役割を提供させることができます。役割は、ADグループまたはASPデータベースから来る可能性があります。 –

+0

@ Phil:ありがとう、私はSecurityTokenValidatedイベントを調べ、私のRPの1つで試してみます。別のRPのロールは、どのクライアントプログラムユーザーが選択するかに基づいて更新されます。その場合、私はそれぞれのリクエストでそれらをチェックする必要があります。 – gbs

3

最善の解決策は、IdPの(あなたの現在のSTS) RP-STS(または連盟プロバイダ)を持っているだろう。あなたが言うように、将来、あなたが複数のIdPに頼っている場合(たとえば、ライブやGoogleなどを使用している場合)、必要なクレームを提供することはほとんどありません。

RP-STSの目的は、あなたのアプリが必要とするものにクレームセットを正確に正規化することです。

それは次のようになります。

enter image description here

あなたが持っているとき、RP-STSは、特に便利です:

  1. 多くのIdP(あなたと外部のもの)
  2. 多くのaplications
  3. 多くのRPに適用できる主張の変換。 RP-STSはuserXの知識が「役割Y」になっているという「権限」です。その知識は1つのアプリを排除するものではありません。
  4. プロトコル遷移関数

変換(T)は、独立のIdPの、各アプリケーションが必要とする特許請求の範囲を追加/削除することになります。

Roles.IsUserInRoleではなく、「役割」クレームを追加するとアプリが動作する理由は、一般のアプリでUser.IsInRoleがチェックされ、プリンシパルのClaimsetに対して解決され、切断されたためですロールプロバイダ。これは間違いなく、ロールプロバイダが設計されている方法の問題です。

RP-STSの欠点は、管理する必要がある余分なコンポーネントです。しかし、今日はむしろ簡単なオプションがあります:ACS(アクセスコントロールサービス)は1つです。カスタムSTSを構築する場合は、もちろんこれを実行できます。

RP自体のクレームを変換するための適切な場所は、Custom ClaimsAuthenticationManager(あなたがすでに確認済み)を作成することです。少なくとも、それはそれを行うための "公式"拡張ポイントです。しかし、他のsoutionsでもうまくいくかもしれません。

+0

はい、私はどこかでそれについて読んでいましたが、私はクレームベースのアイデンティティガイドで推測しています。今のところ、外部のプロバイダを経由してログインできるようにする計画はありません。 – gbs

+0

私は複数の権限とカスタムclaimAuthenticationManagerを使用している状況があります。変換のためには、私は身元の名前を制御できないので権限を把握する必要があり、権限を使用しないと重複する可能性があります。権限の名前を取得する方法 – Hemant

関連する問題