4

MVC3では、ロール リストに明示的にリストされていなくても、常に承認されるロール ( SuperAdmin )を作成する方法はありますか?

たとえば、このマークアップでは...

[Authorize(Roles="Accounting")]

私は経理の役割ではありませんが、SuperAdminとしてこのアクションを承認される方法はありますか?

4

2 に答える 2

2

Securing your ASP.NET MVC 3 Applicationを読むことを強くお勧めします。

まず、次を作成しますAnonymousAttribute

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, 
                AllowMultiple = false,    
                Inherited = true)]
public sealed class AllowAnonymousAttribute : Attribute 
{ 
}

次に、GlobalAuthorize属性を作成します。

public sealed class GlobalAuthorize : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        bool bypassAuthorization = 
            filterContext.ActionDescriptor
                         .IsDefined(typeof(AllowAnonymousAttribute), 
                                    true)
            || filterContext.ActionDescriptor
                            .ControllerDescriptor
                            .IsDefined(typeof(AllowAnonymousAttribute),
                                       true)
            || (filterContext.RequestContext
                            .HttpContext
                            .User != null
                && filterContext.RequestContext
                                .HttpContext
                                .User
                                .IsInRole("SuperAdmin"));

        if (!bypassAuthorization)
        {
            base.OnAuthorization(filterContext);
        }
    }
}

3 番目に、GlobalAuthorize をグローバル フィルター (global.asax) に登録します。

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
  filters.Add(new GlobalAuthorize());
}

現在、すべてのコントローラーにアクセスするには、ユーザーがログインする必要があります。コントローラーまたはコントローラー メソッドは、AllowAnonymous 属性を使用して匿名アクセスを許可できます。さらに、すべてのメソッドは、SuperAdmin ロールのユーザーによって許可されます。

于 2012-07-11T21:27:54.163 に答える
1

AuthorizeAttributeメソッド内のどこにAuthorizeCore追加のロジックを実装できるかをカスタマイズして作成できます。

適切なエラー処理のない簡単な例:

public class AuthorizeSuperAdminAttribute : AuthorizeAttribute
{
     protected virtual bool AuthorizeCore(HttpContextBase httpContext) 
     {    
         IPrincipal user = httpContext.User; 
         if (user.Identity.IsAuthenticated && user.IsInRole("SuperAdmin"))
                return true;

         return base.AuthorizeCore(httpContext);    
     }
}

次に、アクションで通常どおりに使用できます。

[AuthorizeSuperAdmin(Roles="Accounting")]
public ActionResult MyAction()
{
}
于 2012-07-11T21:22:18.120 に答える