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

问题描述 投票:3回答:2

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

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

c# asp.net-mvc-5 authorize-attribute
2个回答
5
投票

请记住,身份验证和授权是您应用程序中的独立问题。

基本上,您将需要实现IAuthenticationFilter

[查看MVC5管道http://www.dotnet-tricks.com/Tutorial/mvc/LYHK270114-Detailed-ASP.NET-MVC-Pipeline.html-自MVC4 Pipeline起发生了许多变化(来源:dotnet-tricks.com

最重要的是引入了验证过滤器。以前,他们将Authentication和Authorization处理合并到[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应用程序中,默认的身份验证机制是Forms,为此它有一个默认的帐户控制器和相应的视图添加到我们的项目中。因此,只要让用户“掉队”,他们就可以进入登录页面。

希望有帮助:)


1
投票

首先,ASP.NET版本实际上与任何内容都不相关。关于在切换框架版本之间可能遇到的唯一事情是,某些方法可能已被弃用或添加。但是,在4.5个点发行版之间,几乎没有任何变化,出于您的目的,在4.6版中也几乎没有变化。

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

关于路线,这很简单。 Authorize属性实际上不会路由到任何地方。如果用户未获得授权,则返回的状态码为401或403。此时,MVC框架将接管工作,并根据使用的身份验证方案采取适当的步骤来授权用户。对于Forms Auth / Identity,它将重定向到登录页面,对于HTTP摘要,它将弹出基于浏览器的登录模式,等等。

长短,如果您要重定向,则表示Authorize返回401,如果返回401,则表示该用户未被授权。干净利落。可能是该用户没有您认为的角色,该用户实际上并未登录(在未正确加入域或与AD失去连接的计算机上,Windows Auth的常见问题)等等

© www.soinside.com 2019 - 2024. All rights reserved.