Проверьте, существует ли сессия через ActionFilter - PullRequest
2 голосов
/ 03 августа 2011

У меня есть проект, который я построил без использования шаблона по умолчанию, вместо этого я сделал все с самого начала.

Теперь мне нужно реализовать проверки для администратора, и я не думаю, что

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 ]

1 голос
/ 03 августа 2011

Для этого Авторизация в ASP.NET MVC предназначена:

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

В основном это вызов HttpContext.Current.User.IsInRole("Admin").

.установите нужные вам роли RoleProvider: http://msdn.microsoft.com/en-us/library/system.web.security.roleprovider.aspx

Вы также можете проверить пользователей:

[Authorize(Users = "Admin1,Admin2")]   
public ActionResult someAction()
{
   // do it
}
1 голос
/ 03 августа 2011

Вы должны использовать 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, перенаправляет на страницу «Не авторизовано».

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}
                        });
            }


        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...