设置IAuthorizationFilter的结果

时间:2008-09-21 06:20:04

标签: asp.net-mvc

我希望从失败的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");
        }
    }
}

2 个答案:

答案 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" };
    }
}