如何為ABP應用程序自定義登錄管理器


在使用應用程序啟動模板創建新應用程序之后,您可能需要擴展或更改SignIn Manager的默認行為,以滿足身份驗證和注冊流程的需要。ABP帳戶模塊登錄管理使用身份管理模塊,而身份管理模塊使用默認的Microsoft身份登錄管理器請參閱此處)。

要編寫您的自定義登錄管理器,您需要擴展Microsoft身份登錄管理器類並將其注冊到DI容器。

本文檔說明了如何針對您自己的應用程序自定義SignIn Manager。

創建一個CustomSignInManager

創建一個繼承Microsoft Identity包SignInMager新類

public class CustomSignInManager : Microsoft.AspNetCore.Identity.SignInManager<Volo.Abp.Identity.IdentityUser> {         public CustomSignInManager(             Microsoft.AspNetCore.Identity.UserManager<Volo.Abp.Identity.IdentityUser> userManager,             Microsoft.AspNetCore.Http.IHttpContextAccessor contextAccessor,             Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory<Volo.Abp.Identity.IdentityUser> claimsFactory,             Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.IdentityOptions> optionsAccessor,             Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Identity.SignInManager<Volo.Abp.Identity.IdentityUser>> logger,             Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider schemes,             Microsoft.AspNetCore.Identity.IUserConfirmation<Volo.Abp.Identity.IdentityUser> confirmation)             : base(userManager, contextAccessor, claimsFactory, optionsAccessor, logger, schemes, confirmation)         {         } }
C#

使用Volo.Abp.Identity.IdentityUser類型使SignInManager繼承,而不是繼承應用程序的AppUser,這一點很重要

之后,您可以覆蓋所需的任何SignIn Manager方法,並添加身份驗證或注冊流程所需的新方法和屬性。

重寫GetExternalLoginInfoAsync方法

在這種情況下,我們將覆蓋GetExternalLoginInfoAsync實現第三方身份驗證時調用方法。

重寫方法的一個好方法是復制其源代碼在這種情況下,我們將使用源代碼的較小修改版本,該版本顯式顯示了方法和屬性的名稱空間,以幫助更好地理解該概念。

public async override Task<Microsoft.AspNetCore.Identity.ExternalLoginInfo> GetExternalLoginInfoAsync(string expectedXsrf = null) {     var auth = await Context.AuthenticateAsync(Microsoft.AspNetCore.Identity.IdentityConstants.ExternalScheme);     var items = auth?.Properties?.Items;     if (auth?.Principal == null || items == null || !items.ContainsKey(LoginProviderKey))     {         return null;     }      if (expectedXsrf != null)     {         if (!items.ContainsKey(XsrfKey))         {             return null;         }         var userId = items[XsrfKey] as string;         if (userId != expectedXsrf)         {             return null;         }     }      var providerKey = auth.Principal.FindFirstValue(ClaimTypes.NameIdentifier);     var provider = items[LoginProviderKey] as string;     if (providerKey == null || provider == null)     {         return null;     }      var providerDisplayName = (await GetExternalAuthenticationSchemesAsync()).FirstOrDefault(p => p.Name == provider)?.DisplayName         ?? provider;     return new Microsoft.AspNetCore.Identity.ExternalLoginInfo(auth.Principal, provider, providerKey, providerDisplayName)     {         AuthenticationTokens = auth.Properties.GetTokens(),         AuthenticationProperties = auth.Properties     }; }
C#

要調用您的重寫方法並使自定義的SignIn Manager類起作用,您需要將您的類注冊到Dependency Injection System

注冊到依賴注入

CustomSignInManager應通過添加IdentityBuilderIdentityBuilderExtensions的AddSignInManager擴展方法來完成注冊

在您的.Web項目中,找到,YourProjectNameWebModule然后在PreConfigureServices方法下添加以下代碼,以將舊代碼替換為SignInManager自定義代碼:

PreConfigure<IdentityBuilder>(identityBuilder => {     identityBuilder.AddSignInManager<CustomSignInManager>(); });
C#

源代碼

您可以在此處找到完整示例的源代碼

https://community.abp.io/articles/how-to-customize-the-signin-manager-3e858753


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM