ASP.NET MVC 5 错误的重定向登录页面

本文关键字:重定向 登录 错误 NET MVC ASP | 更新日期: 2023-09-27 18:34:00

我正在使用"个人用户帐户"身份验证模板创建 ASP.NET MVC 5。然后,我创建自定义登录页面以使用表单身份验证从数据库对用户进行身份验证。

<authentication mode="Forms">
  <forms loginUrl="~/User/SignIn" timeout="2880" protection="All" />
</authentication>

为了测试自定义登录页面,我添加了具有Authorize属性的HomeController。运行视觉工作室后,它会重定向到"登录"页

问题是当我在HomeController删除Authorize属性并在 FilterConfig 添加授权过滤器时.cs

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
    filters.Add(new AuthorizeAttribute());
}

我收到 HTTP 错误:"HTTP 错误 401.0 - 未经授权"。如何解决这个问题?

ASP.NET MVC 5 错误的重定向登录页面

通过执行此操作,您可以对登录和注册操作进行身份验证限制。因此,基本上您需要进行身份验证才能登录或注册。在这些操作上放置 allowAnonymous 属性可能会解决此问题。

因为我在

任何人之前至少 8 分钟将正确答案作为评论,所以我会将其添加为答案。

您基本上需要将 [AllowAnonymous] 属性添加到您的登录操作中,因为本质上您创建的筛选器使每个操作都需要授权才能"查看"。

取自允许匿名属性信息

"...在MVC 4 ASP.NET 中,它被烘烤了。通过烘焙,我的意思是:System.Web.Mvc命名空间中有一个内置的AllowAnonymousAttribute,它将匿名访问的操作列入白名单。

取自全局操作筛选器信息

"ASP.NET MVC 3.0 引入了全局操作筛选器 - 一种将操作筛选器应用于 MVC 应用程序中的每个操作的简单方法。"

[AllowAnonymous]
public ActionResult SignIn() {
}

您已经添加了全局属性。您需要将属性[AllowAnonymous]附加到不想应用规则的属性;

  [AllowAnonymous]
  public ActionResult Home() {
    // ...
  }

因为您将AuthorizeAttribute添加到全局过滤器中。当您没有授权和访问所有操作将重定向到"~/用户/登录",但操作映射"~/用户/登录"也需要您的授权。你可以试试这个:

public class NoNeedAuthorizeAttribute : Attribute
{ 
}

并继承 AuthorizeAttribute 覆盖 OnAuthorization 方法,如果操作具有NoNeedAuthorize属性,则忽略:

public override void OnAuthorization(AuthorizationContext filterContext)
{
    if (!filterContext.ActionDescriptor.GetCustomAttributes(typeof(NoNeedAuthorizeAttribute), true).Any())
    {
        base.OnAuthorization(filterContext);
    }
}

NoNeedAuthorizeAttribute添加到登录操作:

public class UserController : Controller
{
    [NoNeedAuthorize]
    public ActionResult SignIn() 
    {
        //Sign in code..
    }
}

最后,将"GlobalAuthorizeAttribute"添加到全球过滤器中:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
     filters.Add(new HandleErrorAttribute());
     filters.Add(new GlobalAuthorizeAttribute());
}