2014-06-30 36 views
0

我有一个关于[Authorization]注释的问题。我有一个带有[Authorization(Roles ="admin")注释的控制器。在控制器中,我有一个动作不需要是管理员,但仍然登录。这是如何完成的?我曾尝试创建一个自定义AuthorizationAttribute类,并将其放置在动作上。这不起作用,有没有办法来覆盖[Authorization]注释?asp.net MVC中的白名单控制器操作5

干杯。

[Authorize(Roles = "admin")] 
public class UserController : Controller 
{ 
    [OwnDataAuthorize] 
    public async Task<ActionResult> Details(string id) 
     { 
      //..... 
     } 
     //... 
    } 
+0

创建一个自定义类应能正常工作。你必须设计两个自定义类。首先将充当** AuthorizationAttribute **,其次将仅仅是一个标识符属性(比如** IgnoreRoleAttribute **),您必须将其放置在您不希望检查任何角色的操作上。然后在授权的情况下,您可以检查源操作方法是否应用了IgnoreRoleAttribute,并且您可以在此处跳过角色授权:) –

+0

我在那里工作,但由于mvc的bug,我需要在自定义类中实现另一个接口5.来源:[link](http://weblogs.asp.net/imranbaloch/new-filter-overrides-in-asp-net-mvc-5-and-asp-net-web-api-2) – kakebake

回答

1

我找到了答案,我的问题here。我是做正确,而是因为与MVC 5中的一个错误,我不得不实现另一个界面,以及在我的自定义类:

public class OwnDataAuthorize : AuthorizeAttribute, IOverrideFilter { 
//.... 
/// <summary> 
     /// Only implemented because of a bug in MVC 5. 
     /// </summary> 
     public System.Type FiltersToOverride 
     { 
      get { return typeof (IAuthenticationFilter); } 
     } 
} 
+0

升级到MVC 5.1或5.1.2 – user960567

+0

是的,我听说它被修复为5.1。 – kakebake

0

没有做到这一点,除了Authorize属性移动到每一个控制器的方法/动作的简单方式。因此,您需要删除[Authorize(Roles = "admin")]并将其添加到除想要授权的方法之外的每种方法。

一个解决将与if语句使用[AllowAnonymous]属性控制器动作内部检查IsAuthenticated

[AllowAnonymous] 
public async Task<ActionResult> Details(string id) 
{ 
    if(!User.Identity.IsAuthenticated) 
     //redirect to loging 
    //other logic here 
    ... 
} 
+0

什么我在那里工作,但我需要在我的自定义类中实现另一个接口,因为mvc 5的错误。[source](http://weblogs.asp.net/imranbaloch/new-filter-overrides-in-asp- net-mvc-5-and-asp-net-web-api-2) – kakebake

相关问题