通过ActionFilter检查会话是否存在

时间:2011-08-03 19:15:41

标签: c# asp.net asp.net-mvc-3

我有一个我没有使用默认模板而构建的项目,而是从头开始做了所有事情。

现在我需要对admin进行检查,我不认为

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...
        }
    }
}

2 个答案:

答案 0 :(得分: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}
                        });
            }


        }

答案 1 :(得分: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
}