2013-05-31 16 views
2

我製作了AuthorizeAttributeBase以延伸AuthorizeAttribute。 它看起來像這樣:如何使用AuthorizeAttributes從我的控制器重定向?

public abstract class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
//Holds the roles allowed to perform the action. 
public IEnumerable<string> roles { get; set; } 

/// <summary> 
/// Authorizes if the current user may perform the action 
/// </summary> 
/// <param name="httpContext">Unused - included for override purposes.</param> 
/// <returns>true if authorized.</returns> 
protected override bool AuthorizeCore(HttpContextBase httpContext) 
{ 
    //Return true if user is in the action allowed roles. 
    if (IsUserInRole) 
    { 
     return true; 
    } 
    else 
    { 
     HttpContext.Current.Response.StatusCode = 401; 
     return false; 
    } 
} 

/// <summary> 
/// Checks if the user is member of a role that is allowed by the authorization 
/// </summary> 
public bool IsUserInRole 
{ 
    get 
    { 
     if (roles != null) 
     { 
      //Check if any of the roles in the session is in the list of roles of the authorization 
      return (MySessionGetter.GetSession().Roles.Intersect<string>(roles).Any()); 
     } 
     //If none of the roles match return false. 
     return false; 
    } 
} 

/// <summary> 
/// Sets the allowed roles of the authorization 
/// </summary> 
/// <param name="userRoles">Allowed roles</param> 
public void AlowedRoles(IEnumerable<string> userRoles) 
{ 
    roles = userRoles; 
} 

我把允許角色名是這樣的:

/// <summary> 
/// Holds the role names. 
/// </summary> 
public static class UserRoles 
{ 
    public static string Administrators = "Administrators"; 
    public static string Teachers= "Teachers"; 
} 

,用我的基礎是這樣的:

/// <summary> 
/// Authorization for the access to the SomeAction 
/// </summary> 
public class AuthorizeAccessToSomeActionAttribute : MyAuthorizeAttribute 
{ 
    public AuthorizeAccessToSomeActionAttribute() 
    { 
     AlowedRoles(new List<string> { UserRoles.Adminstrators, 
              UserRoles.Teachers }); 
    } 
}  

最後但並非最不重要的控制器:

/// <summary> 
    /// The main Index view of application 
    /// </summary> 
    /// <returns>Application Index views</returns> 
    [AuthorizeAccessToSomeAction] 
    public ActionResult Index() 
    { 
      return View("Index"); 
    } 

現在我想要做的是使索引開關返回值的基礎上AuthorizeAttribute s。 可以說教師TeachersIndex()和管理員AdministratorsIndex()

我嘗試添加這基礎:

//Checks if the current user is authorized. 
public bool IsAuthorized() 
{ 
    return AuthorizeCore(new HttpContextWrapper()); 
} 

但我最終不得不建立新的AutorizeAttribute小號每次。 使它static似乎給我更多的問題。

有沒有正確的方法去做這件事?


解決了它。 :) 0123'覆蓋讓我有了一個新的領導。 找到這個question

我把重定向在Dictionary<string, RedirectToRouteResult>,因爲我喜歡將所有角色字符串保存在一個地方而不是用魔法字符串填充我的控制器的想法。

public static Dictionary<string, RedirectToRouteResult>  HomeRedirect 
    { 
     get 
     { 
      return new Dictionary<string, RedirectToRouteResult> { 
       {"Administrators", new RedirectToRouteResult(
        new RouteValueDictionary { { "action", "AdministratorIndex" }, { "controller", "MyController" }})}, 
       {"Teacher", new RedirectToRouteResult(
        new RouteValueDictionary { { "action", "TeacherIndex" }, { "controller", "MyController" }})} 
}; 

而且override HandleUnauthorizedRequest現在看起來是這樣的:

 protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { 
     filterContext.Result = UserRoles.HomeRedirect 
      .SingleOrDefault(m => m.Key == MySessionGetter.GetSession().Roles.First()).Value; 
    } 

回答

2

看看RedirectToRouteResult和RedirectResult。 這裏將是一個良好的開端:

// Redirects users of given role to given action 
public class AuthorizeAccessToSomeActionAttribute : MyAuthorizeAttribute 
{ 
    public string Role { get; set; } 
    public string RedirectToAction { get; set; } 

    public AuthorizeAccessToSomeActionAttribute(string role, string action) 
    { 
     Role = role; 
     RedirectToAction = action; 
    } 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     // Test if current user is in the role 
     if (filterContext.HttpContext.User.IsInRole(Role)) 
     { 
      // Get current routevalues 
      var rvals = filterContext.RouteData.Values; 
      // Change action 
      rvals["action"] = RedirectToAction; 
      filterContext.Result = new RedirectToRouteResult("Default",rvals); 
     } 
    } 
} 

用法:

// Redirect role to given action 
    [AuthorizeAccessToSomeActionAttribute("Teacher", "TeacherIndex")] 
    [AuthorizeAccessToSomeActionAttribute("Admin", "AdminIndex")] 
    public ActionResult Index() 
    ... 
    public ActionResult TeacherIndex() 
    ... 
    public ActionResult AdminIndex() 
相關問題