MVC3では、ロール リストに明示的にリストされていなくても、常に承認されるロール ( SuperAdmin )を作成する方法はありますか?
たとえば、このマークアップでは...
[Authorize(Roles="Accounting")]
私は経理の役割ではありませんが、SuperAdminとしてこのアクションを承認される方法はありますか?
MVC3では、ロール リストに明示的にリストされていなくても、常に承認されるロール ( SuperAdmin )を作成する方法はありますか?
たとえば、このマークアップでは...
[Authorize(Roles="Accounting")]
私は経理の役割ではありませんが、SuperAdminとしてこのアクションを承認される方法はありますか?
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 ロールのユーザーによって許可されます。
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()
{
}