私たちの古いソフトウェア アーキテクチャは、役割ベースの検証を使用していました。次に、クレーム ベースの承認を使用します。実際のところ、ロールベースのテクノロジを使用していたとしても、主張をモデル化するものを常に使用していたと思います。
最下位レベルは特権です。特権は、「ユーザーを追加するユーザー サービスを呼び出す」または短い「UserService.Add」の場合があります。グループに権限を割り当てることができます。ユーザーはグループのメンバーになることができます。最終的に、グループ メンバーシップを通じて、ユーザーは特権のリストを持つことができます。
古いシステムでは、UserNamePasswordValidator、IAuthorizationPolicy、およびCodeAccessSecurityAttributeの組み合わせを使用して、サービス メソッドの上に記述された属性を持ち、サービス メソッドの呼び出し時に有効性がチェックされていました。ユーザーが必要な権限を持っていない場合、アクセスは拒否されます。うまくいきました。
[CompanyRoleRequired(SecurityAction.Demand, Role = "Common.Connect")]
[CompanyRoleRequired(SecurityAction.Demand, Role = "SomeServiceName.Save")]
public void Save(IEnumerable<Data> data)
{
// code
}
ここで、クレーム ベースの承認を使用したいと思います。上記のモデルを維持して、以前の特権ごとにクレームを作成するか、またはその操作の有効な値を持つ各サービスのクレームを作成します。たとえば、"UserService.Add" の代わりにクレーム "UserService" を追加すると、以前の特権を持つユーザーは値 "Add" を持つクレームを取得できます。サービス開発者にも同様の簡単なアクセス チェックを提供したいので、サービス メソッドの上に必要なクレームに注釈を付けたいと考えています。Microsoft は、これに対してClaimsPrincipalPermissionAttributeを既に提供しています。
IAuthorizationPolicy を実装する代わりに、 ClaimsAuthorizationManager を実装しました。
質問 1)承認マネージャーが 2 回呼び出されます。1 回は SOAP の URL で、もう 1 回は自分の属性で。私はたくさんグーグルで検索しましたが、それは設計によるものと思われます。呼び出しを区別して自分の呼び出しだけをチェックするのに問題はありませんが、何かが見えなかったのかもしれません。URLを使用してsoap呼び出しで呼び出されず、属性に対してのみ呼び出されるオプションまたは簡単な方法はありますか?
質問 2)アクセス チェックは、プリンシパルがクレームを持っているかどうかをチェックする機能を提供します。明らかに、クレームにはタイプ/名前と値があります。属性がそのようなインターフェースを提供することを期待していたでしょう。ただし、属性はリソースと操作について知りたいと考えています。上書きする必要があるアクセスチェック機能は、リソースと操作もチェックする必要があります。何故ですか?リソース/操作を AuthorizationManager のクレームにマップする必要がありますか? また、その必要性が見当たらない場合は、クレームの予想されるタイプと値をリソースと操作として属性に入れ、承認マネージャーでそれらを 1:1 でマップするだけでよいでしょうか? それとも、これを行うと重要なセキュリティ機能を逃してしまうのでしょうか?