簡體   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