2013-04-13 14 views
0

我使用控制器或采取行动的Authorize属性,如:在一个地方定义授权属性,用于多个ActionResults?

[Authorize(Roles="admin,user", Users="user1,user2")] 
public ActionResult LogOn(LogOnModel model, string returnUrl) { 
    return view(); 
} 

然而,我必须定义像这样[Authorize(Roles="admin,user",Users="user1")]每个控制器或动作上。

如何在一个地方/文件中定义这个?

请问RegisterGlobalFilters这样做?我不知道如何使用全局过滤器来定义​​。

+0

为什么没有全局过滤器工作?你有没有试过这个:http://stackoverflow.com/questions/13346801/register-global-filters-in-asp-net-mvc-4-and-autofac – rliu

回答

1

试试这个

创建一个新的文件,并使用该属性头在矿井行动

public class AuthorizeAttribute : FilterAttribute, IAuthorizationFilter 
{ 
    private readonly RoleEnum[] _acceptedRoles; 


public AuthorizeAttribute(params RoleEnum[] acceptedroles) 
{ 
    _acceptedRoles = acceptedroles; 
} 

public AuthorizeAttribute(params bool[] allowAll) 
{ 
    if (allowAll[0]) 
     _acceptedRoles = new RoleEnum[] { RoleEnum.Admin, RoleEnum.user}; 
} 

public void OnAuthorization(AuthorizationContext filterContext) 
{ 
    if (SessionHelper.UserInSession == null)//user not logged in 
    { 
     FormsAuthentication.SignOut(); 
     filterContext.Result = 
      new RedirectToRouteResult(new System.Web.Routing.RouteValueDictionary {{ "controller", "Home" }, 
             { "action", "Index" }, 
             { "returnUrl", filterContext.HttpContext.Request.RawUrl } });//send the user to login page with return url 
     return; 
    } 
    if (!_acceptedRoles.Any(acceptedRole => SessionHelper.UserInSession.UserRoles.Any(currentRole => acceptedRole == currentRole.Role))) 
     //allow if any of the user roles is among accepted roles. Else redirect to login page 
     throw new UnauthorizedAccessException(); 

} 
} 

这也工作了返回URL

Reference

+0

谢谢你的答复。这必须用在每一个动作上? – zomboo

+0

“RoleEnum.Admin,RoleEnum.user”是否等于[Authorize(Roles =“*”,Users =“*”)]? – zomboo

+0

我的管理员和用户不使用asp.net成员资格,我使用数据库来保存用户和角色。 – zomboo