6

私は3つのモデルを持っています[User、Role、およびUserRole]

{ID [PK]、名前、電子メール、パスワード、.....} を使用
ロール {ID [PK]、名前、説明、.......}
UserRole {UserID [FK], RoleID [FK]}

[Authorize] 属性を使用したコントローラーの役割ベースの承認で、クラス内のコントローラー アクションにアクセスするには、ユーザーが管理者の役割を持っている必要があることを指定します。

[Authorize(Roles = "Administrator")]
public class PageController : Controller
{
    // Controller code here
}

これでいい、私が必要なのは、

Role Collection を [Authorize] 属性に割り当てる方法はありますか? 例えば

Logged in User から割り当てられたロールを取得し、List に保存します。このリストを [承認] 属性に割り当てることはできますか? 次のようなもの:

[Authorize(Roles = MyDynamicallyLoadedList)]
public class PageController : Controller
{
    // Controller code here
}
4

2 に答える 2

1

はい。

  1. global.asax で PostAuthenticateRequest をオーバーライドする
  2. データベースからロールをロードする
  3. 新しいを作成しますGenericPrincipal
  4. Thread.CurrentPrincipalプリンシパルをおよびに割り当てますHttpContext.Current.User

例:

protected void Application_OnPostAuthenticateRequest(object sender, EventArgs e)
{
    if (User.Identity.IsAuthenticated)
    {
        string[] rolelist = GetRoleListForUserFromAPI(User.Identity.Name);
        HttpContext.Current.User = new GenericPrincipal(User.Identity, rolelist);
        Thread.CurrentPrincipal = HttpContext.Current.User;
    }
}
于 2012-09-04T12:07:32.337 に答える
1

さて、2つの問題。

まず、リストを属性のパラメーターとして使用することはできません。代わりに配列を使用できます。 http://msdn.microsoft.com/fr-fr/library/ms177221%28v=vs.100%29.aspx

次に、属性パラメーターの値はコンパイル時に認識されている必要があります。リストの内容は実行時にのみ認識されます。

次のようなメッセージが表示されます。

属性引数は、定数式、typeof 式、または属性パラメーター タイプの配列作成式でなければなりません

解決策は、新しい Authorization 属性を作成し (から継承AuthorizeAttribute)、オーバーライドすることです。AuthorizedCore

例(問題に適応できる)はここにあります

于 2012-09-04T12:04:23.900 に答える