Asp.net mvc MVC跳过控制器身份验证使用操作

Asp.net mvc MVC跳过控制器身份验证使用操作,asp.net-mvc,authorization,Asp.net Mvc,Authorization,是否可以绕过控制器上的授权角色检查,但对操作强制执行角色检查?我花了一些时间研究这个问题,我发现的所有东西都显示了如何实现AllowAnonymousAttribute。我目前正在使用AllowAnonymousAttribute,它非常适合完全绕过操作授权。那不是我想要的。我有一个需要特定角色的控制器。当请求特定操作时,我希望跳过控制器级别的角色,只验证用户是否在操作上指定了角色 下面是一些代码: [Authorize(Roles="Administrator")] public class

是否可以绕过控制器上的授权角色检查,但对操作强制执行角色检查?我花了一些时间研究这个问题,我发现的所有东西都显示了如何实现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)
    {
        //....
    }
}
[授权(角色=“管理员”)]
公共类成员控制器:ViewApicController
{
//行动清单。。。。
[授权(Roles=“ApiUser”)]
[HttpPost]
公共作废自动支付邮件([FromBody]列表自动支付列表)
{
//....
}
}
问题是我希望仅具有“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)
    {
        //....
    }
}
[授权(角色=“管理员”)]
公共类成员控制器:ViewApicController
{
//行动清单。。。。
[授权(Roles=“ApiUser”,ignorecontrolleroles=true)]
[HttpPost]
公共作废自动支付邮件([FromBody]列表自动支付列表)
{
//....
}
}

如果我理解正确,您可以实现一个定制的BypassControllerCheckAttribute(用于修饰您希望允许“passthrough”访问的方法),然后在LogonAuthorizeAttribute中检索此请求调用的操作方法,并检查其自定义属性集合是否具有ByPassControllerChecksAttribute实例。如果允许,则运行代码检查是否允许用户访问该方法,否则运行代码检查是否允许用户访问控制器。当然,如果您只有一个方法,并且已知名称不会更改,那么您可以绕过额外的属性,只检查名称,但是第一个方法当然要好得多

编辑
如果LogonAuthorizeAttribute继承自AuthorizeAttribute,则可以重写AuthorizeCore方法,该方法返回布尔值(true表示用户已授权,否则为false)。在此方法中,您可以使用以下伪代码:

if(CheckIfMethodHasByPassAttribute()){
    return CheckIfUserIsAllowedToRunThisMethod();
}
return CheckIfUserIsAllowedToRunThisController();

方法CheckIfUserIsAllowedToRunThisMethod将具有您需要执行的任何检查,以确定是否允许用户运行此方法,而CheckIfUserIsAllowedToRunThisController将具有代码,以检查是否允许用户访问控制器(我假定已在LogonAuthorizeAttribute中)

执行类似操作,检查角色/用户是否在角色中,然后拒绝其中任何一个

然后像这样装饰控制器/动作:

[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)
    {
        //....
    }
}


希望它能帮助你

然后建立一个自定义属性?Lol ok。我将如何在属性中实现这一点?使用名为“IgnoreControlleroles”的属性构建自定义属性是最简单的部分。它将如何工作?我有一个名为“LogonAuthorizeAttribute”的属性,该属性通过操作过滤器()全局添加到所有控制器。我可以检查这个自定义属性,如果它存在,做些什么。问题是我不知道如何绕过控制器授权,但允许操作授权。我有LogonAuthorizeAttribute,可以检查BypassControllerCheckAttribute。我不明白如何只运行操作或控制器授权。我该怎么做?你有代码示例吗?好的,我来试一试。非常感谢。您还可以为验证指定操作名,HttpContextBase携带操作名,因此您可以提供另一个参数来检查操作名AutoPayPost;
    [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);
    }