我有一个用两个自定义ActionFilterAttribute修饰的方法.
[RequiresAuthentication(Order = 1)]
[ToonAction(Order = 2)]
public ActionResult Browse(...
Run Code Online (Sandbox Code Playgroud)
RequiresAuthentication属性来自这篇文章
在RequiresAuthentication内部,OnActionExecuting我做:
filterContext.HttpContext.Response.Redirect(loginUrl, true);
Run Code Online (Sandbox Code Playgroud)
该行被执行,参数全部按预期执行.问题是在执行上面的行后,我得到了下一个属性(ActionFilterAttribute),好像重定向不起作用,它只是继续执行请求,而不是简单地重定向浏览器.
问题:我还需要做什么来制作请求处理程序
这是一个完整的方法:
public override void OnActionExecuting(ActionExecutingContext filterContext) {
//redirect if not authenticated
var identity = filterContext.HttpContext.User.Identity;
if (!identity.IsAuthenticated) {
//use the current url for the redirect
string redirectOnSuccess = filterContext.HttpContext.Request.Url.PathAndQuery;
//send them off to the login page
string redirectUrl = string.Format("?ReturnUrl={0}", redirectOnSuccess);
string loginUrl = FormsAuthentication.LoginUrl + redirectUrl;
filterContext.HttpContext.Response.Redirect(loginUrl, true);
// filterContext.Result = new HttpUnauthorizedResult();
// filterContext.HttpContext.Response.StatusCode = 0x191;
}
}
Run Code Online (Sandbox Code Playgroud)
tva*_*son 27
您希望将filterContext上的Result设置为RedirectResult,而不是对响应进行重定向.
filterContext.Result = new RedirectResult { Url = loginUrl };
Run Code Online (Sandbox Code Playgroud)
编辑:正如@Hunter Daley建议的更好的机制是使用AuthorizeAttribute,如果它适合你.如果您确实具有AuthorizeAttribute不起作用的身份验证/授权方案,则从它派生自定义属性而不是更通用的ActionFilterAttribute可能会更好.无论如何,正确的技术是设置结果而不是直接与Response交互.您可能需要查看http://www.codeplex.com/aspnet上的实际AuthorizeAttribute源以获取相关信息.
我的博客http://farm-fresh-code.blogspot.com上也有自定义授权代码示例.