2010-01-28 72 views
4

我正在尋求保護我的MVC應用程序的不同區域,以防止標準用戶訪問管理類型視圖。目前,如果任何用戶登錄並嘗試查看關於頁面(在Visual Studio中開箱即用模板),它將簡單地將它們重定向到登錄頁面。我希望用戶被告知他們沒有查看該頁面的權限。使用AspNetSqlRoleProvider處理ASP.NET MVC中的拒絕安全問題

[Authorize(Roles="Admin")] 
public ActionResult About() 
{ 
    return View(); 
} 

這似乎是多餘的一個已認證的用戶發送到登錄頁面時,他們沒有權限。

+0

http://stackoverflow.com/questions/1315524/is-it-possible-to-override-the-default-behavior-of-authorize-in-asp-net-mvc – womp 2010-01-28 19:46:33

回答

3

這是我創建的一個屬性,可用於指導未經授權的安全操作。它還允許您指定一個將被傳遞給安全控制器上的未授權操作的原因,然後您可以將該原因用於視圖。

您可以創建任意數量的屬性來自定義該屬性以適合您的特定應用程序,只需確保將其添加到RouteValueDictionary。

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)] 
public sealed class ApplySecurityAttribute : ActionFilterAttribute 
{ 
    private readonly Permission _permission; 

    public ApplySecurityAttribute(Permission permission) 
     : this(permission, string.Empty) {} 

    public ApplySecurityAttribute(Permission permission, string reason) 
    { 
     _permission = permission 
     Reason = reason; 
    } 

    public string Reason { get; set; } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (!PermissionsManager.HasPermission(_permission)) // Put security check here 
     { 
      var routeValueDictionary = new RouteValueDictionary 
             { 
              { "controller", "Security" }, // Security Controller 
              { "action", "Unauthorized" }, // Unauthorized Action 
              { "reason", Reason }   // Put the reason here 
             }; 

      filterContext.Result = new RedirectToRouteResult(routeValueDictionary); 
     } 

     base.OnActionExecuting(filterContext); 
    } 
} 

這裏是安全控制器

public class SecurityController : Controller 
{ 
    public ViewResult Unauthorized(string reason) 
    { 
     var vm = new UnauthorizedViewModel { Reason = reason }; 

     return View(vm); 
    } 
} 

這裏是你想確保

[ApplySecurity(Permission.CanNuke, Reason = "You are not authorized to nuke!")] 

這裏,控制器上的屬性聲明PermissionsManager怎麼做的檢查,以查看用戶有權限

public static class PermissionsManager 
{ 
    public static bool HasPermission(EZTracPermission permission) 
    { 
     return HttpContext.Current.GetCurrentUser().Can(permission); 
    } 
} 
相關問題