Подтвердить что ты не робот

Использование параметров действия в пользовательском атрибуте авторизации в ASP.NET MVC3

У меня есть контроллер, который должен запрашивать авторизацию только при загрузке с определенными параметрами. Например, когда идентификатор параметра равен 8, например.

Я придумал использовать специальный атрибут проверки следующим образом:

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (/* Action inputparameter ID = 8 */)
        {
        return base.AuthorizeCore(httpContext);
        }
        return true;
    }
}

Мое действие выглядит так (не это интересно)

[MyAuthorize]
public ActionResult Protected(int id)
{
    /* custom logic for setting the viewmodel from the id parameter */
    return View(viewmodel);
}

Проблема заключается в том, что вы видите, что я не знаю, как проверить этот параметр ID в атрибуте authorize. Можете ли вы помочь мне с решением?

4b9b3361

Ответ 1

Если идентификатор передается как параметр запроса (GET или POST) или как параметр данных маршрута:

protected override bool AuthorizeCore(HttpContextBase httpContext)
{
    // first look at routedata then at request parameter:
    var id = (httpContext.Request.RequestContext.RouteData.Values["id"] as string) 
             ??
             (httpContext.Request["id"] as string);
    if (id == "8")
    {
        return base.AuthorizeCore(httpContext);
    }
    return true;
}

Ответ 2

До тех пор, пока AuthorizeAttribute наследуется, вы можете получить свой параметр от AuthorizationContext, как показано ниже:

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        string idParam = filterContext.Controller.ValueProvider.GetValue("id").AttemptedValue;
        int id;

        if (int.TryParse(idParam, out id))
        {
            if (id == 8) // apply your business logic here
                return;
        }

        filterContext.Result = new HttpUnauthorizedResult();
    }
}

[MyAuthorize]
public ActionResult Protected(int id)
{
    return View();
}

ValueProvider будет проходить через всех зарегистрированных поставщиков, которые по умолчанию включают RouteDataValueProvider, QueryStringValueProvider и FormValueProvider, и выполняют всю работу за вас.

В противном случае я рекомендую использовать ActionFilterAttribute.

Ответ 3

Вам нужно что-то подобное.

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        int? id = GetId(filterContext);

        if (id.HasValue)
        {
          ...
        }
    }

    private static int? GetId(ActionExecutingContext filterContext)
    {
        int? Id = null;

        if (filterContext.ActionParameters.ContainsKey("Id"))
        {
            Id = (int?)filterContext.ActionParameters["Id"];
        }
    }

Ответ 4

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var rd = httpContext.Request.RequestContext.RouteData;
        string currentAction = rd.GetRequiredString("action");
        string actionparam =Convert.ToString(rd.Values["param"]);

        if (id == actionparam)
        {
            return base.AuthorizeCore(httpContext);
        }
return true;
 }