有没有人对 [Authorize] 属性如何处理标准 ASP.NET MVC 5 应用程序中的路由有很好的解释?

Does anyone have a good explanation on how the [Authorize] Attribute handles routes in a standard ASP.NET MVC 5 application?

如您所见from my previous post,我在使用 MVC 5 的 [Authorize] 属性时遇到了很多困难。隔壁商店的开发团队无法弄清楚为什么我在 Frameworks 4.5.2、4.5.3 或 4.6 中创建的每个新项目中属性总是失败(失败,我的意思是用属性装饰一个动作方法将自动将所有用户(无论是否已授权)重定向到 401 页面)。我的新标准做法是在我构建的每个会员系统中创建一个继承自 AuthorizeAttribute 的自定义属性,但这显然并不理想。

MSDN 没有任何基于代码的解释说明该属性实际上如何将未经授权的用户重新路由到登录页面(预期行为),这是确定真正的错误是否存在所需的关键见解我的代码库,或者是 IIS 主机设置中的一个怪癖。有谁能一劳永逸地白盒这个属性吗?

首先,ASP.NET这个版本真的没有任何关系。关于在切换框架版本之间您可能遇到的唯一事情是某些方法可能被弃用或添加。但是,任何 4.5 点版本之间的变化都非常小,为了您的目的,4.6 的变化很小。

特别是对于 Authorize 属性,唯一相关的是您的 MVC 版本,因为它是 MVC 的一部分。由于它保持不变,因此您实际上并没有通过尝试切换框架版本来做任何事情。

至于它的路由方式,它非常简单。 Authorize 属性实际上不会路由到任何地方;它所做的只是 return 状态代码 401 或 403(如果用户未被授权)。 MVC 框架此时接管并采取适当的步骤根据正在使用的身份验证方案授权用户。对于 Forms Auth / Identity,它将重定向到登录页面,对于 HTTP 摘要,它将弹出基于浏览器的登录模式等。

总而言之,如果您被重定向,则意味着 Authorize 是 returning 401,如果是 returning 401,则意味着 用户未经授权。干净利落。可能是用户没有您认为的角色,用户实际上没有登录(Windows Auth 在未正确加入域或以其他方式丢失的计算机上的常见问题与 AD 的连接)等

请记住,身份验证和授权在您的应用程序中是分开的。

基本上你需要实现一个 IAuthenticationFilter

看看 MVC5 管道 http://www.dotnet-tricks.com/Tutorial/mvc/LYHK270114-Detailed-ASP.NET-MVC-Pipeline.html - there have been a number of changes since MVC4
(来源:dotnet-tricks.com

最重要的是引入了身份验证过滤器。以前他们将身份验证和授权处理合并到 [Authorize] 过滤器中,现在他们已经正确地将这些问题分开。

詹姆斯·钱伯斯 (James Chambers) 的一篇不错的文章应该可以让您很好地概述这些过滤器在请求的生命周期中的行为方式:http://jameschambers.com/2013/11/working-with-iauthenticationfilter-in-the-mvc-5-framework/

抛出未经授权的结果应该做到:

public void OnAuthentication(AuthenticationContext filterContext)
{
    if (!filterContext.Principal.Identity.IsAuthenticated)
        filterContext.Result = new HttpUnauthorizedResult();
}

在 MVC 应用程序中,默认的身份验证机制是表单,为此我们的项目添加了一个默认的帐户控制器和相应的视图。因此,通过简单地让用户“掉线”,他们将最终到达登录页面。

希望对您有所帮助:)