• AbpZero之企业微信登录(拓展第三方auth授权登录)第一步:查看AbpZero的auth第三方登录的底层机制


    在AbpZero框架中,auth登录接口位于Web.Core库下的Controllers文件夹的TokenAuthController.csExternalAuthenticate方法

     

    ExternalAuthenticate方法的代码如下:

     1   [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         }
    View Code

    我们查看 GetExternalUserInfo下面的方法,发现它是已经封装成了Abp.AspNetZeroCore.Web.dll,我们用反编译工具可以看到对应的代码

    随便拿个谷歌的auth登录看下

     1 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 }
    View Code

    发现auth登录都是继承于ExternalAuthProviderApiBase

    篇幅太长,下回分解。

    
    
  • 相关阅读:
    Fabric简介
    推荐一个在线Markdown编写网站,可转化PDF,DOC格式
    7-独立事件和互不相容(概率论与数理统计学习笔记)
    6- 全概率公式/贝叶斯公式(概率论与数理统计学习笔记)
    5-条件概率/乘法公式(概率论与数理统计学习笔记)
    4-几何概型/频率/公理化(概率论与数理统计学习笔记)
    3-古典概率与排列组合(概率论与数理统计学习笔记)
    PLS-00306: 调用 'SYNCRN' 时参数个数或类型错误
    C# MongoDB 查询,分组,聚合,排序,条件,分页
    MVC + Vue.js 初体验(实现表单操作)
  • 原文地址:https://www.cnblogs.com/LmuQuan/p/9122143.html
Copyright © 2020-2023  润新知