我想知道[Authorize]
属性如何识别此用户是否经过身份验证?
如果用户有效,则我们调用FormsAuthentication.SetAuthCookie()
方法,并根据MSDN此方法:
为提供的用户名创建身份验证票证,并将其添加到响应的cookie集合中,如果您使用的是无Cookie身份验证,则将其添加到URL。
[Authorize]属性是否检查身份验证票证或Cookie集合?
答案 0 :(得分:2)
[Authorize]
不处理任何身份验证机制。它仅在用户IIdentity
中查找IsAuthenticated
标志。它还将查看用户IsMemberOf
方法,以获取基于角色的授权。
解码身份验证票证的所有工作都是在应用程序管道的早期阶段完成的,它会设置这些标志。在调用授权属性方法时,所有工作都已完成并存储在用户运行时数据中。
您可以轻松检查Authorize属性的源代码,您会发现它本质上非常简单。它只是根据一些简单的查找返回true或false。
在.net核心中变得更加复杂,它基于策略而不是,但最初的MVC实现非常简单。
答案 1 :(得分:0)
我的回答与ASP.NET Core有关我不确定你是否询问过经典的ASP.NET,但这应该是类似的。
您需要为[Authorize]
添加一个中间件才能工作。 ASP.NET Core提供了开箱即用的中间件,您也可以添加自定义身份验证处理程序。
您可以通过阅读https://github.com/aspnet/Security/tree/dev/src
来查看其实施方式例如,您想要使用JWT承载认证,您必须添加JWT承载中间件,这只是AuthenticationBuilder:https://github.com/aspnet/Security/blob/dev/src/Microsoft.AspNetCore.Authentication.JwtBearer/JwtBearerExtensions.cs的扩展,它在引擎盖下调用AddScheme
。
您想要使用基于Cookie的身份验证,只需拨打AddCookie
,这也是一个名为AddScheme
的扩展程序:https://github.com/aspnet/Security/blob/dev/src/Microsoft.AspNetCore.Authentication.Cookies/CookieExtensions.cs
此处记录了它的用法:https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2x?view=aspnetcore-2.1
另见Using the [Authorize] Attribute
Web API提供了内置的授权过滤器AuthorizeAttribute。此筛选器检查用户是否已通过身份验证。如果不是,则返回HTTP状态代码401(未授权),而不调用该操作。
如果您对此过滤器的工作原理感兴趣,可以check it here。
在获得授权之前,您必须经过身份验证,这是对其负责的逻辑:https://github.com/aspnet/Security/blob/644f34e90d35b369efdce9c11ab1db42e0a7f4a7/src/Microsoft.AspNetCore.Authorization.Policy/PolicyEvaluator.cs#L91
总结
[Authorize]属性如何知道此用户已通过身份验证。
仅授权属性并不知道此用户是否经过身份验证。这是由身份验证中间件处理的,并严格依赖于它尝试进行身份验证的方案。 It simply tries to authenticate with schemes you have added(cookie,jwt etc.)致电HttpContext.AuthenticateAsync,只是简单地调用AuthenticationService.AuthenticateAsync并从结果HttpContext.User
设置ClaimsPrincipal
,这只是来自{{1}等架构处理程序的结果例如,3}}。我认为这应该让你更深入地了解这是如何运作的。
通常,如果您正在开始新项目,我建议您不要使用经典的ASP.NET,并使用.NET Core为未来做好准备,因为现在一切都朝这个方向发展。 ASP.NET 5(我也称之为"经典")现在几乎已经死了。