[英]How [Authorize] attribute get to know that the user is authenticate in ASP.NET MVC, is it by using authentication token?
我想知道[Authorize]
属性如何识别此用户已通过身份验证?
如果用户有效,则我们调用FormsAuthentication.SetAuthCookie()
方法,根据MSDN,此方法为:
为提供的用户名创建身份验证票证,并将其添加到响应的cookie集合中,如果使用的是无cookie身份验证,则将其添加到URL。
[Authorize]属性是否检查身份验证票证或cookie收集?
[Authorize]
本身不涉及任何身份验证机制。 它只是看起来在用户IIdentity
的IsAuthenticated
标志。 它还将在用户IsMemberOf
方法中查找基于角色的授权。
解码身份验证票证的所有工作都在应用程序管道的早期阶段完成,该阶段设置了这些标志。 在调用Authorization Attribute方法时,所有工作已经完成,并存储在用户运行时数据中。
您可以轻松地检查Authorize属性的源代码,并且您会发现它本质上非常简单。 它只是基于一些简单的查找而返回true或false。
它在.net核心中变得越来越复杂,因为它基于策略而并非基于策略,但是原始的MVC实现非常简单。
我的答案与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
调用AddScheme
扩展: https : //github.com/aspnet/Security/blob/dev/src/Microsoft.AspNetCore.Authentication.Cookies/CookieExtensions。 cs
此处记录了它的用法: https : //docs.microsoft.com/zh-cn/aspnet/core/migration/1x-to-2x/identity-2x?view=aspnetcore-2.1
另请参见使用[Authorize]属性
Web API提供了内置的授权过滤器AuthorizeAttribute。 该过滤器检查用户是否已通过身份验证。 如果不是,它将返回HTTP状态代码401(未授权),而不调用操作。
必须先进行身份验证,然后才能被授权,这是对此负责的逻辑: https : //github.com/aspnet/Security/blob/644f34e90d35b369efdce9c11ab1db42e0a7f4a7/src/Microsoft.AspNetCore.Authorization.Policy/PolicyEvaluator.cs#L91
综上所述
[Authorize]属性如何知道此用户已通过身份验证。
仅Authorize属性不知道此用户是否已通过身份验证。 这由身份验证中间件处理,并严格取决于它尝试进行身份验证的方案。 它只是通过调用HttpContext.AuthenticateAsync(它只是在ClaimsPrincipal
调用AuthenticationService.AuthenticateAsync )尝试通过添加的方案(cookie,jwt等)进行身份验证 ,并从结果ClaimsPrincipal
设置HttpContext.User
,而结果ClaimsPrincipal
则仅是模式处理程序之类的结果例如, jwt处理程序 。 我认为这应该使您更深入地了解其工作原理。
通常,如果您要开始新项目,我不建议您使用经典的ASP.NET并为.NET Core的未来做准备,因为现在所有事情都朝着这个方向发展。 ASP.NET 5(我也将其称为“经典”)现在已经死了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.