C# 在asp.net mvc3中未授权用户时重定向到另一页
我读过 及 但是来自答案(意思)的链接不起作用 我把 在我的web.config中,我已经C# 在asp.net mvc3中未授权用户时重定向到另一页,c#,asp.net,asp.net-mvc,asp.net-mvc-3,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 3,我读过 及 但是来自答案(意思)的链接不起作用 我把 在我的web.config中,我已经 <authentication mode="Forms"> <forms loginUrl="~/Account/LogOn" timeout="2880" /> </authentication> 登录前,登录页面表单正确显示,但在访问/RestrictedPage/Index页面时出现上述错误。我可以使用授权访问RestrictedPagepage
<authentication mode="Forms">
<forms loginUrl="~/Account/LogOn" timeout="2880" />
</authentication>
登录前,登录
页面表单正确显示,但在访问/RestrictedPage/Index
页面时出现上述错误。我可以使用授权访问RestrictedPage
page的不同用户登录
我的错误在哪里?如何设置重定向?是的,正如您在web.config中提到的那样,它是正确的
<forms loginUrl="~/Account/LogOn" timeout="2880" />
重定向正在查找帐户控制器和登录操作结果。如果要重定向页面,请在此处更改而不是帐户和登录默认的
授权
属性的行为方式是,当用户未经身份验证或身份验证但未经授权时,它会将状态代码设置为401(未授权)。当过滤器将状态代码设置为401时,ASP.NET framework将检查网站是否启用了表单身份验证,然后将其重定向到在那里设置的loginUrl
参数
如果要更改该行为,请说如果用户已通过身份验证但未经授权,则要将用户重定向到AccessDenied
控制器,则必须扩展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
属性而不是内置属性。放置/Account/LogOn”而不是“~/Account/LogOn”我喜欢mark的答案,但我不想更改所有动作属性
从[授权]到[客户授权] 我编辑
Login()
对AccountController
的操作并在显示视图之前检查
Request.IsAuthenticated
我认为,如果经过身份验证的用户转到
/Account/Logon
,我将重定向到
/Error/AccessDenied
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
if (Request.IsAuthenticated)
{
return RedirectToAction("AccessDenied", "Error");
}
ViewBag.ReturnUrl = returnUrl;
return View();
}
因为我不想覆盖
AuthorizeAttribute
,所以我使用了过滤器
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;
}
}
投票并接受!备注:必须使用
受保护的override void HandleUnauthorizedRequest(AuthorizationContext filterContext){
来重写该方法,否则将无法工作这是我一直遇到的一个解决方案,但这真的仍然是唯一的方法吗?必须重新创建[授权]
仅用于更改路径的筛选似乎有些过分。但在这种情况下,如果您已经登录并转到登录页面,您将看到一个/error/accessDenied
而不是/account/login
,对吗?如果您不希望将[Authorize]
更改为[CustomAuthorize]
您总是可以将其命名为YourBrand.YourProject.Security.AuthorizeAttribute
,然后只引用YourBrand.YourProject.Security
或类似的内容。我喜欢这个解决方案,但如果它们已经过身份验证,但未经授权,那么我会重定向到一个无错误的主页,其中每个人都经过授权,并且包括这是一条可选的ViewBag状态消息,上面写着类似$“您无权查看{returnUrl}”。
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
if (Request.IsAuthenticated)
{
return RedirectToAction("AccessDenied", "Error");
}
ViewBag.ReturnUrl = returnUrl;
return View();
}
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;
}
}