Asp.net mvc 2 重定向结果是如何工作的?
我目前使用的Asp.net mvc 2 重定向结果是如何工作的?,asp.net-mvc-2,c#-4.0,Asp.net Mvc 2,C# 4.0,我目前使用的redirectoroutesult如下: public void OnAuthorization(AuthorizationContext filterContext) { User user = filterContext.HttpContext.Session["user"] as User; if (user == null || user.Role != expectedRole) { filterContext.Result = n
redirectoroutesult
如下:
public void OnAuthorization(AuthorizationContext filterContext)
{
User user = filterContext.HttpContext.Session["user"] as User;
if (user == null || user.Role != expectedRole)
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary {
{"controller", _controller}, {"action", _action}
});
}
}
此代码位于我的CheckLoginAttribute
类中
我打算将其用作特定控制器操作的装饰器,例如:
[CheckLogin(RolesEnum.Member, "MyController", "MyAction")]
public JsonResult GetNews()
因此,基本上,我试图缩短对GetNews()的调用,并在用户未登录时跳过操作的执行。如果用户未登录,则我希望它重定向到另一个操作
redirectoroutesult
是否将重定向到适当的操作服务器端,而不必通过客户端执行大循环(例如重写窗口URL位置或类似的操作)?它就是这样工作的吗?否-RedirectXXXResult总是返回HTTP302。这不是Server.Transfer()的等价物。好吧,我自己已经解决了
所以基本上,我需要的不是“重定向”。我找错了地方来解决我的问题。我知道重定向意味着我必须进行多次客户机/服务器访问才能返回json结果,但这感觉不对
我花了一段时间才意识到我可以将任何类型的结果传递到filterContext.result
这是我的错。我问的问题不对,因为我没有完全理解我所面临的问题。经过大量的研究,它最终会变得非常愚蠢
最终解决办法是:
public class CheckLoginAttribute : AuthorizeAttribute, IAuthorizationFilter
{
private RolesEnum expectedRole;
public CheckLoginAttribute(RolesEnum role)
{
expectedRole = role;
}
public override void OnAuthorization(AuthorizationContext filterContext)
{
User user = filterContext.HttpContext.Session["user"] as User;
if (user == null || user.Role != expectedRole)
{
filterContext.Result = new JsonResult()
{
JsonRequestBehavior = JsonRequestBehavior.AllowGet,
Data = new LoginMessage() { IsValidLogin = false }
};
}
}
}
现在我可以用这个来装饰我的动作方法:
[CheckLogin(RolesEnum.Admin)]
再多一点代码以避免ASP.NET会话窃取,我就完成了
我希望这将有助于其他人。
谢谢。您的解决方案不够健壮,会使客户端代码复杂化;更不用说为所有不同类型的客户机维护此代码的开销了 通过返回JSON,响应状态代码将为200。这意味着您需要向每个客户端添加安全逻辑,以解释每个响应,从而检测未经授权的访问。 使用授权筛选器 注: 如果未经授权的用户试图访问标有Authorize属性的方法,MVC框架将返回401 HTTP状态码。如果站点配置为使用ASP.NET表单身份验证,401状态码将导致浏览器将用户重定向到登录页