Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在asp.net mvc3中未授权用户时重定向到另一页_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 3 - Fatal编程技术网

C# 在asp.net mvc3中未授权用户时重定向到另一页

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

我读过

及 但是来自答案(意思)的链接不起作用

我把

在我的web.config中,我已经

 <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;

    }
}