0

Rick Andersonの記事に基づいて、すべてのメソッドにログインを要求するグローバルフィルターを設定しました。ここで、さらに一歩進んで、記事のAllowAnonymous属性または[Authorize(Roles = "Staff")]によってオーバーライドされない限り、すべてのアクションが「管理者」ロールのみに許可されるようにする必要があります。アクセスする「管理者」。

LogonAuthorize属性コンストラクターのロールに追加してみました。

    public LogonAuthorize()
    {
        this.Roles = "Admin";
    }

..しかし、これはすべてのアクションを管理者に制限し、アクションの承認属性でオーバーライドすることはできません。

4

1 に答える 1

4

すぐにそれを理解しました:O

別の承認属性を作成しました。

public sealed class OverrideAuthorize : AuthorizeAttribute
{
}

これを LogonAuthorize のテストとして使用しました。

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true)
        || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true)
        || filterContext.ActionDescriptor.IsDefined(typeof(OverrideAuthorize), true)
        || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(OverrideAuthorize), true);

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

ここで、ホワイトリストに登録されたアクションに OverrideAuthorize (または AllowAnonymous) をタグ付けする必要があります。

    [OverrideAuthorize(Roles = "Staff, Administrator")]
    public ActionResult Index()
    {
        return View();
    }

そのため、LogonAuthorize 属性はデフォルトですべてのコントローラーとアクションに適用され、役割「管理者」が必要ですが、AllowAnonymous または OverrideAuthorize が定義されていない場合にのみ承認されます。

于 2012-05-17T10:55:35.797 に答える