在AbpZero框架中,auth登录接口位于Web.Core库下的Controllers文件夹的TokenAuthController.cs的ExternalAuthenticate方法
ExternalAuthenticate方法的代码如下:
View Code1 [HttpPost] 2 public async Task<ExternalAuthenticateResultModel> ExternalAuthenticate([FromBody] ExternalAuthenticateModel model) 3 { 4 var externalUser = await GetExternalUserInfo(model); 5 6 var loginResult = await _logInManager.LoginAsync(new UserLoginInfo(model.AuthProvider, model.ProviderKey, model.AuthProvider), GetTenancyNameOrNull()); 7 switch (loginResult.Result) 8 { 9 case AbpLoginResultType.Success: 10 { 11 var accessToken = CreateAccessToken(CreateJwtClaims(loginResult.Identity)); 12 13 var returnUrl = model.ReturnUrl; 14 15 if (model.SingleSignIn.HasValue && model.SingleSignIn.Value && loginResult.Result == AbpLoginResultType.Success) 16 { 17 loginResult.User.SetSignInToken(); 18 returnUrl = AddSingleSignInParametersToReturnUrl(model.ReturnUrl, loginResult.User.SignInToken, loginResult.User.Id, loginResult.User.TenantId); 19 } 20 21 return new ExternalAuthenticateResultModel 22 { 23 AccessToken = accessToken, 24 EncryptedAccessToken = GetEncrpyedAccessToken(accessToken), 25 ExpireInSeconds = (int)_configuration.Expiration.TotalSeconds, 26 ReturnUrl = returnUrl 27 }; 28 } 29 case AbpLoginResultType.UnknownExternalLogin: 30 { 31 var newUser = await RegisterExternalUserAsync(externalUser); 32 if (!newUser.IsActive) 33 { 34 return new ExternalAuthenticateResultModel 35 { 36 WaitingForActivation = true 37 }; 38 } 39 40 //Try to login again with newly registered user! 41 loginResult = await _logInManager.LoginAsync(new UserLoginInfo(model.AuthProvider, model.ProviderKey, model.AuthProvider), GetTenancyNameOrNull()); 42 if (loginResult.Result != AbpLoginResultType.Success) 43 { 44 throw _abpLoginResultTypeHelper.CreateExceptionForFailedLoginAttempt( 45 loginResult.Result, 46 model.ProviderKey, 47 GetTenancyNameOrNull() 48 ); 49 } 50 51 var accessToken = CreateAccessToken(CreateJwtClaims(loginResult.Identity)); 52 return new ExternalAuthenticateResultModel 53 { 54 AccessToken = accessToken, 55 EncryptedAccessToken = GetEncrpyedAccessToken(accessToken), 56 ExpireInSeconds = (int)_configuration.Expiration.TotalSeconds 57 }; 58 } 59 default: 60 { 61 throw _abpLoginResultTypeHelper.CreateExceptionForFailedLoginAttempt( 62 loginResult.Result, 63 model.ProviderKey, 64 GetTenancyNameOrNull() 65 ); 66 } 67 } 68 }
我们查看 GetExternalUserInfo下面的方法,发现它是已经封装成了Abp.AspNetZeroCore.Web.dll,我们用反编译工具可以看到对应的代码
随便拿个谷歌的auth登录看下
View Code1 using System; 2 using System.Net.Http; 3 using System.Net.Http.Headers; 4 using System.Threading.Tasks; 5 using Microsoft.AspNetCore.Authentication.Google; 6 using Newtonsoft.Json.Linq; 7 8 namespace Abp.AspNetZeroCore.Web.Authentication.External.Google 9 { 10 // Token: 0x02000010 RID: 16 11 public class GoogleAuthProviderApi : ExternalAuthProviderApiBase 12 { 13 // Token: 0x06000036 RID: 54 RVA: 0x0000244C File Offset: 0x0000064C 14 public override async Task<ExternalAuthUserInfo> GetUserInfo(string accessCode) 15 { 16 ExternalAuthUserInfo result; 17 using (HttpClient client = new HttpClient()) 18 { 19 client.DefaultRequestHeaders.UserAgent.ParseAdd("Microsoft ASP.NET Core OAuth middleware"); 20 client.DefaultRequestHeaders.Accept.ParseAdd("application/json"); 21 client.Timeout = TimeSpan.FromSeconds(30.0); 22 client.MaxResponseContentBufferSize = 10485760L; 23 HttpResponseMessage httpResponseMessage = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, GoogleDefaults.UserInformationEndpoint) 24 { 25 Headers = 26 { 27 Authorization = new AuthenticationHeaderValue("Bearer", accessCode) 28 } 29 }); 30 httpResponseMessage.EnsureSuccessStatusCode(); 31 JObject user = JObject.Parse(await httpResponseMessage.Content.ReadAsStringAsync()); 32 result = new ExternalAuthUserInfo 33 { 34 Name = GoogleHelper.GetName(user), 35 EmailAddress = GoogleHelper.GetEmail(user), 36 Surname = GoogleHelper.GetFamilyName(user), 37 ProviderKey = GoogleHelper.GetId(user), 38 Provider = "Google" 39 }; 40 } 41 return result; 42 } 43 44 // Token: 0x04000010 RID: 16 45 public const string Name = "Google"; 46 } 47 }发现auth登录都是继承于ExternalAuthProviderApiBase
篇幅太长,下回分解。