У меня есть сценарий, который я не смог решить:
Я играю вокруг с созданием моего собственного атрибута полномочий для mvc. Основной бит функциональности, которую я хотел бы добавить, должен иметь способность измениться, где пользователь перенаправляется, если они не находятся в определенной роли. Я не возражаю против этого, система передает их обратно странице входа в систему, если бы они не аутентифицируются, но я хотел бы выбрать, куда отправить их, если они аутентифицируются, но не позволяются получить доступ к тому методу действия.
Вот, то, что я хотел бы сделать:
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
public string Action;
public string Controller;
protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext)
{
// if User is authenticated but not in the correct role
string url = Url.Action(this.Action, this.Controller);
httpContext.Response.Redirect(url);
}
}
И как добавленная премия я хотел бы иметь доступ к ViewContext и TempData, прежде чем я сделаю перенаправление.
Какие-либо мысли о том, как я мог добраться, инстанцируют UrlHelper и ViewContext в атрибуте?
Вы можете переопределить метод OnAuthorization
:
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
// Call the AuthorizeCore which should return true or false
if (!this.AuthorizeCore(filterContext.HttpContext))
{
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary()
{
{ "controller", "home" },
{ "action", "about" },
{ "id", "foo" },
});
}
}
Что касается ViewData и TempData: filterContext.Controller. ViewData
и filterContext.Controller.TempData
должны работать внутри метода OnAuthorization
. И, наконец, если вы хотите использовать UrlHelper
(в этом случае нет необходимости, потому что RedirectToRouteResult
лучше), вы можете создать его экземпляр:
var urlHelper = new UrlHelper(filterContext.RequestContext);