2011-08-03 68 views
2

我有一個我沒有使用默認模板構建的項目,而是從一開始就做了所有事情。通過ActionFilter檢查會話是否存在

現在我需要實現管理檢查,我不認爲

public ActionResult someAction() 
{ 
    if (session exists) 
    { 
     // do it 
    } 
    else 
    { 
     //redirect back or show 403 
    } 
} 

是在每一個刪除/編輯/創建行動是一個好主意。

我想要做的是建立操作過濾器,它將檢查管理員會話是否存在,如果沒有會話,它將重定向到403或類似的東西。

[AdminCheck] 
public ActionResult someAction() 
{ 
    // do it 
} 

但是我不知道該怎麼做。我已經做了一些研究並提出來,但我不知道如何在其中實現功能。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 

namespace stevePortfolio.Infrastructure 
{ 
    public class AdminCheck : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      base.OnActionExecuting(filterContext); 
      // No idea what to write here... 
     } 
    } 
} 

回答

1

您應該爲此使用AuthorizeAttribute。你可以用它開箱檢查,如果用戶是這樣的特定角色的成員:

[Authorize(Roles = "IsAdmin")] 
public ActionResult DoStuff() 
{ 
    //action body 
} 

,或者如果你需要的代碼需要更多的複雜性和地方,你可以繼承它。

public class AuthorizeByRightAttribute : AuthorizeAttribute 
    { 
     protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext) 
     { 
      var authorized = base.AuthorizeCore(httpContext); 
      if (authorized && controller != null) 
      { 
       //Return true or false based on some criteria 
      } 

     } 

然後,您可以以任何您想要的方式處理未經授權的請求。下面的例子是通過發出一個HTTP狀態代碼403和一個jsonresult來檢查我的ajax方法,或者發出正常的http請求,然後重定向到「Not Authorized」頁面。

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
     { 
      if (!controller.PortalSession.ValidSession) 
      { 
       base.HandleUnauthorizedRequest(filterContext); 
      } 
      else 
      { 
       if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest()) 
       { 
        //base.HandleUnauthorizedRequest(filterContext); 
        filterContext.RequestContext.HttpContext.Response.StatusCode = 403; 
        var result = new JsonResult(); 
        result.Data = new {Success=false}; 
        result.JsonRequestBehavior = JsonRequestBehavior.AllowGet; 
        filterContext.Result = result; 
        return; 
       } 

       filterContext.Result = new RedirectToRouteResult(
        new RouteValueDictionary 
         { 
          {"controller", MVC.Login.Name}, 
          {"action", MVC.Login.ActionNames.NotAuthorized}, 
          {"group", RequiredRole} 
         }); 
      } 


     } 
+0

但我怎麼能告訴我登錄的服務器和我聯繫? – sed

+0

Okey我找到了一些信息並使其工作。謝謝。 – sed

1

這就是在ASP.NET MVC的Authorize attibute是:

[Authorize(Roles = "adminRole")] 
public ActionResult someAction() 
{ 
    // do it 
} 

它是什麼基本上HttpContext.Current.User.IsInRole("Admin")通話。

要設置的角色,你需要一個RoleProviderhttp://msdn.microsoft.com/en-us/library/system.web.security.roleprovider.aspx

您還可以檢查用戶:

[Authorize(Users = "Admin1,Admin2")] 
public ActionResult someAction() 
{ 
    // do it 
} 
+0

但我如何在登錄時將角色設置爲管理員? – sed

+0

這就是RoleProvider的功能:http://odetocode.com/Articles/428.aspx – Peter