2008-09-21 51 views
2

我期待从失败的IAuthorizationFilter中设置结果操作。但是我不确定如何从Filter内部创建一个ActionResult。该控制器似乎并没有从过滤器内部感觉到,所以我平常的View(“SomeView”)不起作用。有没有办法让控制器或另一种创建actionresult的方式,因为它似乎不可实例化?IAuthorizationFilter的设置结果

不起作用:

[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"); 
     } 
    } 
} 

回答

1

您可以直接实例化适当的ActionResult,然后把它放在上下文。例如:

public void OnAuthorization(AuthorizationContext context) 
{ 
    if (!context.HttpContext.User.Identity.IsAuthenticated) 
    { 
     context.Result = new ViewResult { ViewName = "Whatever" }; 
    } 
} 
2

您应该看看MVC框架AuthorizeAttribute附带的IAuthorizationFilter的实现。如果您使用表单身份验证,则无需将结果设置为用户/登录。您可以提出401 HTTP状态响应,ASP.NET将重定向到您的登录页面。

将结果设置为用户/登录的一个问题是用户的地址栏未更新,因此它们将位于登录页面上,但URL不匹配。对于一些人来说,这不是问题。但有些人希望他们网站的网址符合用户在浏览器中看到的内容。