Использование параметров действия в пользовательском атрибуте авторизации в 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.
Можете ли вы помочь мне с решением?
Ответы
Ответ 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;
}