2012-03-21 46 views
4

我的網站對所有人開放,但我有一個只有管理員用戶名和密碼才能進入的方法的控制器。我將bool IsManager保存在session中。
我想使用授權屬性來阻止誰有IsManager == falsemvc 3 session and authorizeAttribute

回答

7

首先定義一個ActionFilter

public class TheFilter: ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var session = filterContext.HttpContext.Session; 
     if ((bool?)session["IsManager"] == true) 
      return; 

     //Redirect him to somewhere. 
     var redirectTarget = new RouteValueDictionary 
      {{"action", "{ActionName}"}, {"controller", "{ControllerName}"}}; 
     filterContext.Result = new RedirectToRouteResult(redirectTarget); 
    } 
} 

然後用它被限制的動作(或控制)以上:

//[TheFilter] 
public class ManagersController : Controller 
{ 
    [TheFilter] 
    public ActionResult Foo() 
    { 
     ... 
     return View(); 
    } 
} 
+0

安全過濾器應該實現IAuthorizationFilter - 它在操作過濾器之前運行。您正在使用動作過濾器開啓安全漏洞購買。請參閱我的MSDN關於過濾器的文章http://msdn.microsoft.com/en-us/library/gg416513(VS.98).aspx最好覆蓋管理控制器的OnAuthorization過濾器。 – RickAndMSFT 2012-03-21 22:55:46

+0

@ Rick.Anderson-at-Microsoft.com我相信它的情況以及驗證過濾器,您需要格外小心,因此您也不會遇到緩存問題,併爲其他用戶返回內容,否? – 2012-03-22 03:27:56

+0

@ Rick.Anderson-at-Microsoft.com。我閱讀你的文章。看不到任何我打開的安全漏洞,你能舉個例子嗎? – gdoron 2012-03-22 10:13:29

1

要使用ASP.NET安全牢記這行你應該將IsManager角色添加到您的成員資格/角色系統,然後將該用戶添加到該角色。此時不需要黑客入侵,您可以使用內置的Authorize屬性。

您是否使用內置的會員供應商?如果是這樣,這將是一個快照。

+0

現在我不使用任何像會員提供商。我的網站是公開旁邊的一小部分,這是一個經理只有控制器,我想限制訪問... – 2012-03-21 22:01:52

+0

然後,您可以簡單地在Application_AuthenticateRequest上創建原型,並在其中填充角色,以便您可以使用Authorize屬性。這樣,如果您移動到成員系統,則不需要更改任何屬性在自定義屬性的情況下) – 2012-03-22 03:26:06