0

実行時に属性のパラメータを変更する方法はありますか? サービスにアクセスできるロールを割り当てているサービスがあります。これらの役割を実行時に割り当てたいと考えています。

  [HttpGet]
   [Authorize(Roles="admin")]
    public DataTable GetAllProducts()
    {
        FormToken auth = new FormToken();
        DataTable dt = new DataTable();
        if (!auth.isAuthenticated())
        {
            dt.Columns.Add("Error");
            DataRow dr = dt.NewRow();
            dr["Error"] = "Login to get the Service";
            dt.Rows.Add(dr);
            return dt;
        }
        var rec = from log in db.Products select log;
        return rec.ToDataTable();
4

3 に答える 3

2

ヴィベク、

authorize 属性は継承でき、OnAuthorize メソッドをオーバーライドできます。以下のようなもの。

public sealed class AuthorizationAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        //do custom authorization here
        base.OnAuthorization(filterContext);
    }
}

この時点で、承認のために必要なことは何でもできます。カスタム コンストラクターを追加して、独自の変数を設定できます。たとえば、現在このオーバーライドを使用して、ユーザーが承認されているかどうか、特定の場所にアクセスできるかどうかを検出しています。

乾杯

于 2013-09-19T11:05:42.810 に答える
1

@Nico によって提案された方法が機能します。

間違いなくより優れたカプセル化と柔軟性を提供する代替手段は、 のClaimsPrincipalPermissionAttribute代わりにを使用することAuthorizeAttributeです。これは WIF の一部であり、理論的には .Net での ID と承認のための優先フレームワークです。

このモデルでは、リソースと操作の観点から、リクエストの承認コンテキストClaimsPrincipalPermissionAttributeを指定します。つまり、誰がアクセスできるかではなく、リクエストを記述します。

次に、実際の承認ロジックはClaimAuthorizationManager、現在のユーザー プリンシパルと承認コンテキストが指定されたカスタムにカプセル化されます。その仕事は、純粋に許可チェックを行うことです。これClaimAuthorizationManagerは、アプリケーションの web.config ファイルの構成によって制御できます。

これはすべてここで説明されています

http://msdn.microsoft.com/en-us/library/system.identitymodel.services.claimsprincipalpermissionattribute.aspx

私はこの方法を好みますが、どちらか一方を優先する強い理由があるとは思いませんこのアプローチの利点は次のとおりだと思います。

  • より良いカプセル化を提供します
  • より柔軟です
  • MVC フレームワークではなく CLR によって呼び出されます。つまり、単体テストまたは装飾されたメソッドが呼び出される場所で呼び出されます。
  • 宣言的にだけでなく、命令的にも使用できます (ClaimsPrincipalPermission.CheckAccess("Customer","Add"))
  • マイクロソフトの方向性とより一致しているようです

デメリットは

  • .Net 4.5 のみです。.Net 3.5 または 4 を使用している場合は、以前のバージョンの WIF を使用する必要があります。これは、.Net 4.5 バージョンに非常に似ています (ただし、同一ではありません)。名前空間はMicrosoft.IdentityModel代わりにSystem.IdentityModel

私が言うように、それは私の意見ではほとんど好みの問題です.

于 2013-09-19T11:25:37.700 に答える
0

非宣言的なユーザー権限の検証については、System.Security.Permissions.PrincipalPermission代わりにAuthorizeAttribute. これにより、実行時にターゲット ロールを指定できます。認証の方法によっては、認証されたユーザー プリンシパルが に割り当てられていることを確認する必要がある場合がThread.CurrentPrincipalあります。PrincipalPermissionHttpContext.Current.UserAuthorizeAttribute

于 2013-09-19T11:55:59.780 に答える