我希望从失败的IAuthorizationFilter设置结果操作。但是,我不确定如何从Filter内部创建ActionResult。控制器似乎不能从过滤器内部进行操作,因此我通常的View(“SomeView”)无效。有没有办法获得控制器或另一种创建动作结果的方法,因为它似乎不是可实例化的?
不起作用:
[AttributeUsage(AttributeTargets.Method)]
public sealed class RequiresAuthenticationAttribute : ActionFilterAttribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext context)
{
if (!context.HttpContext.User.Identity.IsAuthenticated)
{
context.Result = View("User/Login");
}
}
}
答案 0 :(得分:2)
您应该查看MVC框架AuthorizeAttribute附带的IAuthorizationFilter的实现。如果您使用表单身份验证,则无需将结果设置为用户/登录。您可以引发401 HTTP状态响应,ASP.NET将重定向到您的登录页面。
将结果设置为user / login的一个问题是用户的地址栏未更新,因此它们将位于登录页面上,但URL将不匹配。对某些人来说,这不是问题。但有些人希望他们网站的网址与用户在浏览器中看到的内容相对应。
答案 1 :(得分:1)
您可以直接实例化相应的ActionResult,然后在上下文中设置它。例如:
public void OnAuthorization(AuthorizationContext context)
{
if (!context.HttpContext.User.Identity.IsAuthenticated)
{
context.Result = new ViewResult { ViewName = "Whatever" };
}
}