2013-04-13 15 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