クレームベース認証と他のアプローチとの違いについては、すでに多くの質問が寄せられています: ロールベースvsクレームベースクレームベース認証の説明 今、私の好きな答えは、stackoverflowで与えられたものです: クレームベースの認証を使用する 。
しかし、それらを読んだ後、私の質問は解決されません。私の質問は2つあります。
私の質問をさらに詳しく説明するために、クレームベース、ロールベース、および属性ベースの承認の見方を3つの例で示します。 免責事項:これらの例が正しいかどうかはわかりませんが、これらは私の質問の一部にすぎません。
私は 興味深いブログポスト を読みました。ここでは、MVC/Web APIでクレームベース認証を使用する方法が説明されています。メソッドは(そのブログポストで)クレームを確認することで保護(承認)されているようですメソッドにアクセスしようとしているユーザーに関連付けられているユーザー。そのユーザーが「streetaddresses」を「表示」する要求を持っている場合、そのユーザーにはそのデータを表示する権限があります。
[ClaimsAuthorize("Read", "SomeData")]
public string Get()
{
return “somedata”;
}
現在、クレームの作成はどこか別の場所に分けられていますが、そのブログポストでは実際に指定されていません。非表示のメソッドは、その特定の役割を持つユーザーがストリートアドレスの表示を許可されているかどうかをチェックすると想定しています。それでは、役割ベースの承認との違いは何ですか?
違いははっきりしませんが、古いロールベースの承認と比較してみましょう。各メソッドの属性をもう一度定義して、そのメソッドの実行を特定のロールに制限することができます。 'streetaddresses'メソッドは、たとえば、 'admin'の役割を持つユーザーに制限されています。したがって、個別のメソッドでロールをチェックする代わりに、ここでそれをチェックします。それともここで何か不足していますか?
[RoleAuthorize('admin')]
public string Get()
{
return “somedata”;
}
私は、よりきめ細かな認可制御の利点を理解しています。しかし、私はこのようなものを実装して、管理者の役割を持つユーザーのみが勤務時間中に「somedata」にアクセスできることを定義し、その管理者ユーザーが青い目をしている場合に限ります。
[AttributeAuthorize('role=admin;time=09-17;eyecolor=blue')]
public string Get()
{
return “somedata”;
}
この最後の例は本当に私には有利に思えますが、クレームベースの承認である最初の例と同じかどうかはわかりません。
最後に、最後の質問がポップアップしました:
属性はクレームです。クレームは、ユーザーが特定の属性を持っているという誰か/何かによる単なる声明です。 IdPまたはデータベースからデータを取得するロジックの内部ビットである可能性がある発行者です。
これにより、特定のタスクが常に特定の属性を持つユーザーを必要とするように指定できるため、システムの設計方法にwayより多くの柔軟性が与えられます。特定の権利、「CanTransferMoney」と言います。誰がそれを実行できるかを適切に説明する、どのような役割を作成できますか?それを行うことができるのは、どれだけの頻度であるでしょうか?
より高いレベルでは、「Money Manager」ロールのすべてのユーザーが「CanTransferMoney」属性を持つように構成できますが、そうすることで、コードを変更する必要がなくなりますが、コードにロールをハードコーディングする必要がある場合があります。
あなたの最後の質問に関しては、概念的に、クレームはあなたが持つ権利を定義し、属性はあなたが持つ権利を定義します。私の意見では、ある時点で、それは本当に、どの名前を使用したいかについての意味論に帰着します。 SAMLトークンが元々どのように設計されたかを見ると、主張はアサーションで提供された属性の関数である/であることがわかります。