2016-04-14 13 views
7

文字列値を返す名前がGetRole()の静的メソッドがあります。
これで、属性パラメータを使用して呼び出す必要があります。例えば
アトリビュートパラメータを使用してメソッドを呼び出す方法

[Authorize(Roles = GetRole())] 
public ActionResult Get() 
{ 
} 

public static string GetRole() 
{ 
    return "Admin"; 
} 

しかし、コンパイラはエラーの下に取得する:

An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type

属性でメソッドを呼び出すために私を助けてください。

+0

できません。コンパイル時に解決できるパラメータ値のみが受け入れられます。 –

+1

属性はコードとして格納されず、メタデータとして格納されます。そのため、内部には限られた範囲の構造のみを使用できます。 –

答えて

5

、属性を宣言するとき(その値はコンパイル時に知られなければならないので)あなたは任意のメソッドを呼び出すことはできませんが、あなたはすべてを実行するためにAuthorizeAttribute由来独自のカスタム属性を導き出すことができますあなたが必要とする論理。私たち全員がローカライゼーションに何をしたのではないのですか?NameAttribute &お友達の前にロングウェイトのローカリゼーション対応のデータアノテーションがありますか?コンセプトの

証明:その後、

class DynamicAuthorizeAttribute : AuthorizeAttribute { 
    protected bool AuthorizeCore(HttpContextBase context) { 
     // Perform your logic here, eventually update Roles property 
    } 
} 

とは:

[DynamicAuthorize] 
public ActionResult Get() { 
    // ... 
} 

これは、そこに独自のロジックを置くか、単にRolesプロパティを更新し、通常に委任することができ、ちょうど可能な方法でありますロジックは単にbase.AuthorizeCore(context)を呼び出します。ここのすべてのコードはスレッドセーフでなければならないことに注意してください。

あなたは、静的メソッドで作業していると、あなたのコントローラ内でそのロジックを維持したいならば、あなたは(たとえば)受け入れるように遊ぶことができますが、このような何か:あなたはコントローラにアクセスすることができます

[DynamicAuthorize(typeof(MyView), nameof(GetRole))] 

注意ビュー名はcontext.HttpContext.Request.RequestContext.RouteDataです。

このような静的メソッドを呼び出します。ロジックが本当に複雑で大きく変化する場合は、このロジックを集中化し、他のMVC ツールを使用して、これを行うことができます。

1

An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type.

これは事実です。回避策はありません。属性引数はコンパイル時定数でなければなりません。メソッドを呼び出すことはできません。

あなたは定数を定義されて何ができるか:

public class MyClass 
{ 
    public const string Role = "Admin"; 
    [Authorize(Roles = Role)] 
    public ActionResult Get() 
    { 
    }  
} 

定数(名前が示すように)あなたは多分この回避策は、あなたを助けますので、一定の時間をコンパイルします。

あなたは実行時で値を決定したい場合は属性がコンパイル時に割り当てられているように、これは動作しません。コンパイラエラーがかなり明確である

+0

そのダウンボートは何でしたか?おそらく私は 'Authorize'属性を知らないからでしょう。しかし、この質問は、特定の実装を持つ特定の属性に関するものであるとは決して言いませんでした。 「AuthorizeCore」(アドリアーノ・リペッティの言葉通り)がどこに呼ばれたか知りません。 –

+0

私はあなたに投票します。知りません。 –

0

私は自分のログインしたユーザーの認証方法を使用しました。

それを見て、多分あなたを助けるでしょう。

public static bool GetRole(string Codename) 
    {    
     if (LogInUser == null) 
     { 
      return false; 
     } 

     return true; 
    } 

、ユーザーがアクセス権を持っているかいないかどうかを確認するために、

if (!Utility.GetRole("Admin")) 
      return View("AccessDenied"); 

私はまた、認可に建てられた標準のコードを持って、

あなたがそれを必要とする場合、単に以下のコメント。ここにあなたの代わりに、単一の役割で、許可される役割のリストを渡すことができるので、

0

あなたは、このよう

を行うことができ、この方法は、より良いです。

(下を見て、私は両方の管理者とマスターを通過しました)
[Authorization(Roles = "admin,master")] 
public class MyController : Controller 
{ 
    //Your remaining code. 
} 

これを許可するには、これらの方法があります。

public class Authorization : AuthorizeAttribute 
{ 

public string Roles { get; set; } 

protected override bool AuthorizeCore(HttpContextBase httpContext) 
{ 
    if (User != null) 
    { 
     if (String.IsNullOrEmpty(Roles)) 
     { 
      return true; 
     } 

     string[] split = Roles.Split(','); 

     foreach (UserRole item in User) 
     { 
      if (split.Contains(item.Role.CodeName)) 
      { 
       return true; 
      } 
     } 
     return false; 

    } 
    else 
     return false; 
} 

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
{ 
    filterContext.Result = new HttpUnauthorizedResult(); 
} 
} 
+0

Hmmmmm、既存の回答には何も追加せず、既存のAuthorizeAttribute(既に複数の役割を処理しています...)に何も追加しないので、質問に回答しません(メソッドを呼び出す...)。少なくともあなたの他の答えは代替的なアプローチ(宣言的な認可の代わりに命令的)を取った –

+0

はい、@ AdrianoRepetti、多分それは私たちが両方ともある時に回答を与えているからです...そして私はあなたが同じ概念 – Bharat

関連する問題