2

コントローラーでの許可役割チェックをバイパスすることは可能ですが、アクションで役割チェックを強制することはできますか? 私はこれを調査するのに少し時間を費やしましたが、AllowAnonymousAttribute を実装する方法をすべて示しています。私は現在、AllowAnonymousAttribute を使用しており、アクションの承認を完全にバイパスするのに最適です。それは私が欲しいものではありません。特定の役割を必要とするコントローラーがあります。特定のアクションが要求されたときに、コントローラー レベルでロールをスキップし、ユーザーがアクションで指定されたロールを持っていることを確認したいだけです。

ここにいくつかのコードがあります:

[Authorize(Roles="Administrator")]
public class MembersController : ViewApiController<MemberView>
{
    // a list of actions....

    [Authorize(Roles="ApiUser")]        
    [HttpPost]
    public void AutoPayPost([FromBody] List<AutoPayModel> autoPayList)
    {
        //....
    }
}

問題は、「ApiUser」ロールのみを持つユーザーに「AutoPayPost」アクションへのアクセス権を付与することです。クラス レベルの authorize 属性を削除して、それをコントローラーのすべてのアクション メソッドに追加し、'AutoPayPost' アクションを除くことができることに気付きました。私のコントローラーのいくつかは、「管理」ロールを必要とするアクションの長いリストを提供する基本クラスから継承するため、これを避けたいと思います。そのため、すべての基本アクションをオーバーライドし、オーバーライドされたメソッドに Authorize 属性を追加してから、呼び出しを基本クラスにデリゲートする必要があります。これは機能しますが、後で基本クラスに機能を追加することにした場合は、MembersController に戻って新しいメソッドをオーバーライドし、属性などを追加することを忘れないでください...

最終結果が次のようになれば素晴らしいことです。

[Authorize(Roles="Administrator")]
public class MembersController : ViewApiController<MemberView>
{
    // a list of actions....

    [Authorize(Roles="ApiUser", IgnoreControllerRoles=true)]        
    [HttpPost]
    public void AutoPayPost([FromBody] List<AutoPayModel> autoPayList)
    {
        //....
    }
}
4

2 に答える 2

1

ロール/ユーザーがロールに含まれているかどうかを確認し、それらのいずれかを拒否する、このようなことを行います。

public class ByPassAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        string[] roles = this.Roles.Split(',');
        string[] users = this.Users.Split(',');


        foreach (var r in roles)
        {
            if (httpContext.User.IsInRole(r.Trim()))
                return false;
        }

        foreach (var u in users)
        {
            if (httpContext.User.Identity.Name.Equals(u))
                return false;
        }

        return base.AuthorizeCore(httpContext);
    }
}

次に、コントローラー/アクションを次のように装飾します。

    [ByPassAuthorize(Roles = "Admin,test,testint", Users = "Tester")]
    public ActionResult Edit(int id = 0)
    {
        FooModel foomodel = db.FooModels.Find(id);
        if (foomodel == null)
        {
            return HttpNotFound();
        }
        return View(foomodel);
    }

その助けを願っています!

于 2013-05-10T18:29:25.613 に答える