繁体   English   中英

[Authorize]属性如何知道用户在ASP.NET MVC中已通过身份验证令牌进行身份验证?

[英]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]本身不涉及任何身份验证机制。 它只是看起来在用户IIdentityIsAuthenticated标志。 它还将在用户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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM