2012-03-06 29 views
38

我在控制器上有一个授权属性,但我想在一个动作中关闭它。 我创建了我自己的授权筛选器,并将“匿名”添加到角色列表中。在我的过滤器中,如果Anonymous出现在角色列表中,则返回true。是否可以禁用MVC控制器中的一个操作的授权?

但是,它似乎没有通过登录页面,就好像控制器授权是抢占其他任何东西一样。

+0

'(1):'不知道我理解你,有些代码会很好。 '(2):'您可以在操作方法上添加授权属性。 – gideon 2012-03-06 09:54:31

+0

您可以创建属性的自己的版本。 http://stackoverflow.com/questions/746998/override-authorize-attribute-in-asp-net-mvc – Tx3 2012-03-06 10:08:16

+0

哎,大家似乎都不理解你:)。我明白,但我想要一个解决方案,因为我有同样的问题。你在此期间找到了什么? – 2012-12-10 12:03:09

回答

69

您可以将[Authorize]添加到控制器类,然后将[AllowAnonymous]添加到您不希望被授权的单一操作。例如:

[Authorize] 
public class AccountController : Controller 
{ 
    public ActionResult Profile() 
    { 
     return View(); 
    } 

    [AllowAnonymous] 
    public ActionResult Login() 
    { 
     return View(); 
    } 
} 
+1

这只适用于MVC4及更高版本,但它可以很好地工作 – Nathan 2013-02-27 11:28:39

-3

不要在您不需要的操作方法上添加AuthorizationAttribute。

我的自定义属性

public class AuthorizationFilterAttribute : AuthorizeAttribute 
{ 
     Some code... 
} 

我控制器

public class UserController : BaseController, IDisposable 
{ 
     [AuthorizationFilterAttribute] 
     public ActionResult UserList() 
     { 
      //Authorize attribute will call when this action is executed 
     } 

     public ActionResult AddUser() 
     { 
      //Authorize attribute will not call when this action is executed 
     } 

} 

我希望你有我点什么,我想说你。

=================更新回答========================== ===================== 创建一个像下面这样的属性。

public sealed class AnonymousAttribute : Attribute { } 

请将下面的代码放在您的OnAuthorization方法中。

public override void OnAuthorization(AuthorizationContext filterContext) { 
      bool checkForAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AnonymousAttribute), true) 
      || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AnonymousAttribute), true); 
      if (!skipAuthorization) { 
       base.OnAuthorization(filterContext); 
      } 
     } 
+0

好的,但是这意味着要在控制器动作中添加过滤器。我喜欢将授权过滤器保留在最上方的想法,然后禁用我需要的地方。似乎这种方式更强大/安全。 – jaffa 2012-03-07 09:19:19

+0

是的。请让我知道,它是否适用于您?如果是,请将其标记为答案,以便对其他人有用。 – 2012-03-07 12:34:24

+0

它的作用是获得只有你想要的动作的授权,但这不是OP的问题。 – Kyle 2013-02-28 02:47:08

3

您可以创建自己的属性版本。

有一个非常相似的问题,并且有一个相当不错的答案,如何实现自己的属性来处理这种情况。

Override Authorize Attribute in ASP.NET MVC

Btw。你也可以创建你的控制器,默认情况下会有授权。

基地

[Authorize] 
public abstract class SecureControllerBase : Controller 
{ 
} 

使用

public class MyController : SecureControllerBase 
{ 
} 
+0

谢谢,但说我有一个控制器需要授权的10个操作方法,只有1个没有。我的控制器在所有操作上都具有授权(通过在控制器定义的顶部有授权过滤器),但是我只想在一个操作方法中关闭它。 – jaffa 2012-03-06 11:01:32

+0

如果您将[OptionalAuthorize]添加到控制器,然后在操作顶部添加[OptionalAuthorize(false)]?那对你有用吗? – Tx3 2012-03-06 11:18:34

0

属性只需添加到您要筛选的操作,而不是在控制器类。通过不装饰动作,只要控制器或其基控制器之一没有获得该属性,它们就不会被过滤。

+2

我想要规则的例外,所以打开控制器,关闭一个动作。 – jaffa 2012-03-14 10:58:45

1

我刚刚做了一个使用Azure ACS作为联合身份提供程序的解决方案,并且接受的答案对我无效。对于那些正在挣扎的人来说,我的解决方案是完全绕过所需的控制器/视图的安全。

为您需要绕过授权的操作创建新的Controller/Views。

并在网上。config添加以下内容:

<location path="TheNameOfTheControllerYouWantToBypass"> 
    <system.web> 
    <authorization> 
    <allow users="*" /> 
    </authorization> 
    </system.web> 
</location> 
相关问题