2012-01-28 28 views
4

値ハードコーディングして役割を追加することが可能ですませんが、同様の値をハードコーディングではない:私は、データベースまたは設定ファイルからこれらの役割を取得したいと思います役割とAuthorizeAttributeが、役割は

[Authorize(Roles="members, admin")] 

をコントローラアクションのロールを追加/削除する必要がある場合は、アプリケーションを再構築する必要はありません。私はそれを行うことができます列挙型を知っている

... http://www.vivienchevallier.com/Articles/create-a-custom-authorizeattribute-that-accepts-parameters-of-type-enum それでも、これはまだ私のニーズに十分に柔軟ではありません。より洗練されているにもかかわらず、やはりやや難しいコードです。

答えて

3

ユーザーはグループに追加される「グループ」という中間エンティティを作成することです(Admin:Supportなど)。また、グループにはロールのセットがあります。 (例:ユーザーの作成)。この方法で、ロールをハードコーディングし、ユーザーとグループ間の関係を構成できます。

カスタムロールプロバイダを実装する必要があります。あなたの設定からユーザーの役割と役割を比較するカスタム認可属性を作成することができますImplementing a Role Provider On MSDN

[Authorize(Roles="CreateUser")] 
public ActionResult Create() 
{ 

} 
+0

明らかに、私の場合、グループはロールとロールが機能になります。したがって、私の用語を使用して、各ロールは、ロール(1) - 関数(*)のような多対多の関係を持つことになります。私の計画は、あなたの 'CreateUser'属性で行ったようにアクション名を使用することです。この場合、ユーザーを作成する機能を持つロールは許可されます。 –

+0

@zebulaそれは正しいです。 – Eranga

9

を通過します。

public class ConfigAuthorizationAttribute: AuthorizeAttribute 
{ 
    private readonly IActionRoleConfigService configService; 
    private readonly IUserRoleService roleService; 

    private string actionName; 

    public ConfigAuthorizationAttribute() 
    { 
     configService = new ActionRoleConfigService(); 
     roleService = new UserRoleService(); 
    } 

    protected override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     actionName = filterContext.ActionDescription.ActionName; 
     base.OnAuthorization(filterContext); 
    } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var availableRoles = configService.GetActionRoles(actionName); // return list of strings 
     var userName = httpContext.User.Identity.Name; 
     var userRoles = roleService.GetUserRoles(userName); // return list of strings 
     return availableRoles.Any(x => userRoles.Contains(x)); 
    } 
} 

私はあなたに役立つことを願っています。

+0

IActionRoleConfigServiceとIUserRoleServiceにはどのような名前空間がありますか? –

+0

それはあなた自身のサービスです –

+0

MvcとWebApiのあいまいさがあるので、名前空間を追加できますか?ありがとう。 AuthorizationContextには多くの名前空間があります。 :< – granadaCoder

関連する問題