IAuthorizationFilter的设置结果
时间:2020-03-06 14:30:05 来源:igfitidea点击:
我希望从失败的IAuthorizationFilter设置结果操作。但是我不确定如何从筛选器内部创建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"); } } }
解决方案
我们可以直接实例化适当的ActionResult,然后在上下文中进行设置。例如:
public void OnAuthorization(AuthorizationContext context) { if (!context.HttpContext.User.Identity.IsAuthenticated) { context.Result = new ViewResult { ViewName = "Whatever" }; } }
我们应该查看MVC框架AuthorizeAttribute随附的IAuthorizationFilter的实现。如果我们使用表单身份验证,则无需将结果设置为"用户/登录"。我们可以引发401 HTTP状态响应,并且ASP.NET将为我们重定向到登录页面。
将结果设置为用户/登录的一个问题是用户的地址栏未更新,因此他们将位于登录页面上,但URL不匹配。对于某些人来说,这不是问题。但是有些人希望其网站的URL与用户在浏览器中看到的相对应。