当用户未在asp.net mvc3中授权时,重定向到另一个页面
我读了
如果在MVC 3中未经过身份validation,如何轻松重定向? 当用户未获得授权但来自答案的链接(表示http://wekeroad.com/2008/03/12/aspnet-mvc-securing-your-controller-actions/ )不起作用时 , 将重定向到AccessDenied页面 。
我放
[Authorize(Users = "test")] public class RestrictedPageController: Controller { public ActionResult Index() { return View(); } .... }
在我的web.config中,我已经
相应地使用https://stackoverflow.com/a/6770583/998696
但是当我想访问/RestrictedPage/Index
,它必须将我重定向到其他页面(来自其他控制器)。 而不是这个,错误看起来像:
Server Error in '/Project' Application. The view 'LogOn' or its master was not found or no view engine supports the searched locations. The following locations were searched: ~/Views/Account/LogOn.aspx ~/Views/Account/LogOn.ascx ~/Views/Shared/LogOn.aspx ~/Views/Shared/LogOn.ascx ~/Views/Account/LogOn.cshtml ~/Views/Account/LogOn.vbhtml ~/Views/Shared/LogOn.cshtml ~/Views/Shared/LogOn.vbhtml
登录前, Logon
页面表单正确显示,但访问/RestrictedPage/Index
页面时出现上述错误。 我可以使用授权访问RestrictedPage
页面的用户登录。
我的错误在哪里以及如何设置重定向?
默认的Authorize
属性的行为方式是,当用户未经过身份validation或身份validation但未获得授权时,它会将状态代码设置为401(UnAuthorized) 。 当filter将状态代码设置为401时 ,ASP.NET框架会检查网站是否启用了表单身份validation,如果是,则重定向到loginUrl
参数设置。
如果要更改该行为,则表示要将用户重定向到AccessDenied
控制器(如果用户已通过身份validation但未授权),则必须扩展Authorize
属性并覆盖HandleUnauthorizedRequest
方法。
对于前者
public class CustomAuthorize: AuthorizeAttribute { protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { if (!filterContext.HttpContext.User.Identity.IsAuthenticated) { filterContext.Result = new HttpUnauthorizedResult(); } else { filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "AccessDenied" })); } } }
您可以根据需要覆盖HandleUnauthorizedRequest
,然后必须标记控制器操作以使用CustomAuthorize
属性而不是内置属性。
我喜欢马克的答案,
但我不想改变我的所有动作属性
从[授权]到[CustomAuthorize]
我在AccountController
上编辑Login()
动作
并在show view之前检查Request.IsAuthenticated
我想,如果经过身份validation的用户转到/Account/Logon
,
我将重定向到/Error/AccessDenied
。
[AllowAnonymous] public ActionResult Login(string returnUrl) { if (Request.IsAuthenticated) { return RedirectToAction("AccessDenied", "Error"); } ViewBag.ReturnUrl = returnUrl; return View(); }
放置“/ Account / LogOn”而不是“〜/ Account / LogOn”
是的,正如您在web.config中提到的那样
重定向正在寻找帐户控制器和LogOn actionresult。 如果您想重定向您的网页,请更改该网页而不是帐户和登录
由于我不想覆盖AuthorizeAttribute
我使用filter
public class RedirectFilter : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { if (!IsAuthorized(filterContext)) { filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new {controller = "AccessDenied"})); } } private bool IsAuthorized(ActionExecutingContext filterContext) { var descriptor = filterContext.ActionDescriptor; var authorizeAttr = descriptor.GetCustomAttributes(typeof(AuthorizeAttribute), false).FirstOrDefault() as AuthorizeAttribute; if (authorizeAttr != null) { if(!authorizeAttr.Users.Contains(filterContext.HttpContext.User.ToString())) return false; } return true; } }
- Application Insights不记录自定义事件
- 防止在浏览器刷新时重新提交webform,而不会丢失viewstate
- ASP.NET计划删除临时文件
- 使用AdoNetAppender刷新Log4Net缓冲区
- Web请求错误407需要代理身份validation
- DotNetNuke.Services.Mail.Mail.SendEmail和DotNetNuke.Services.Mail.Mail.SendMail之间的区别
- 通过Fiddler发送POST请求到asp.net mvc动作
- WebAPI DataMember通过application / x-www-form-urlencoded进行de / serial化时不使用的名称
- 在ListView控件中查找控件