tnblog
首页
视频
资源
登录

.net core 3.1 Identity Server4 (实现GitHub登录)

7213人阅读 2021/1/19 15:32 总访问:3731202 评论:1 收藏:0 手机
分类: Ids4

.netcore

.net core 3.1 Identity Server4 (实现GitHub登录)

创建GitHub应用

在下面进行身份授权的时候,我去掉了Webhook添加了邮箱的读取。

添加相关代码

添加相关依赖库

  1. Install-Package AspNet.Security.OAuth.GitHub -Version 3.1.6

Startup中,添加Github相关扩展

  1. services.AddAuthentication()
  2. .AddGitHub(options =>
  3. {
  4. options.ClientId = "your_ClientId";
  5. options.ClientSecret = "your_ClientSecret";
  6. // 添加 email
  7. options.Scope.Add("user:email");
  8. });

扩展登录相关代码

LoginViewModel实体中,添加扩展登录ExternalProviders属性。

  1. /// <summary>
  2. /// 获取第三方登录扩展
  3. /// </summary>
  4. public IEnumerable<AuthenticationScheme> ExternalProviders { get; set; }

添加第三方登录注册类ExternalRegisterViewModel

  1. public class ExternalRegisterViewModel
  2. {
  3. public string Username { get; set; }
  4. public string ReturnUrl { get; set; }
  5. }

IdentityCodeAuthController控制器中修改登录内容

  1. [HttpGet]
  2. public async Task<IActionResult> Login(string returnUrl)
  3. {
  4. var vm = new LoginViewModel() { ReturnUrl = returnUrl };
  5. // 获取上下文的内容
  6. var context = await _interaction.GetAuthorizationContextAsync(returnUrl);
  7. vm.Username = context?.LoginHint;
  8. // 获取第三方登录扩展
  9. var externalProviders = await _signInManager.GetExternalAuthenticationSchemesAsync();
  10. vm.ExternalProviders = externalProviders;
  11. return View(vm);
  12. }

在前台添加显示扩展显示标签。

  1. <!-- 外部登录展示 -->
  2. <form asp-controller="IdentityCodeAuth" asp-action="ExternalLogin" asp-route-returnUrl="@Model.ReturnUrl" method="post">
  3. @foreach (var provider in Model.ExternalProviders)
  4. {
  5. <button name="provider" type="submit" value="@provider.Name">@provider.Name</button>
  6. }
  7. </form>

在添加第三方验证

  1. /// <summary>
  2. /// 第三方登录扩展处理
  3. /// </summary>
  4. /// <param name="returnUrl"></param>
  5. /// <returns></returns>
  6. public async Task<IActionResult> ExternalLogin(string provider, string returnUrl)
  7. {
  8. // 制作回调地址
  9. var redirectUri = Url.Action(nameof(ExteranlLoginCallback), "IdentityCodeAuth", new { returnUrl });
  10. var properties = _signInManager.ConfigureExternalAuthenticationProperties(provider,redirectUri);
  11. return Challenge(properties, provider);
  12. }
  13. /// <summary>
  14. /// 重定向到外部登录问题
  15. /// </summary>
  16. /// <returns></returns>
  17. public async Task<IActionResult> ExteranlLoginCallback(string returnUrl)
  18. {
  19. // 获取外部信息
  20. var info = await _signInManager.GetExternalLoginInfoAsync();
  21. // 当我们获取不到就将它跳转回login页重新登录
  22. if (info == null)
  23. {
  24. return RedirectToAction("Login");
  25. }
  26. // 获取相关信息
  27. var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, false);
  28. if (result.Succeeded)
  29. {
  30. return Redirect(returnUrl);
  31. }
  32. // 找不到就注册
  33. var username = info.Principal.FindFirst(ClaimTypes.Name.Replace(" ", "_")).Value;
  34. return View("ExternalRegister",new ExternalRegisterViewModel {
  35. Username = username,
  36. ReturnUrl = returnUrl
  37. });
  38. }
  39. /// <summary>
  40. /// 获取第三方注册处理
  41. /// </summary>
  42. /// <returns></returns>
  43. public async Task<IActionResult> ExternalRegister(ExternalRegisterViewModel vm)
  44. {
  45. // 获取外部信息
  46. var info = await _signInManager.GetExternalLoginInfoAsync();
  47. // 当我们获取不到就将它跳转回login页重新登录
  48. if (info == null)
  49. {
  50. return RedirectToAction("Login");
  51. }
  52. // 创建用户 (这里就没要密码)
  53. var user = new IdentityUser(vm.Username);
  54. // 获取邮箱
  55. user.Email = info.Principal.Claims.FirstOrDefault(x => x.Type.Contains("email"))?.Value;
  56. var result = await _userManager.CreateAsync(user);
  57. if (!result.Succeeded)
  58. {
  59. return View(vm);
  60. }
  61. // 向指定用户添加外部用户登录信息
  62. result = await _userManager.AddLoginAsync(user, info);
  63. if (!result.Succeeded)
  64. {
  65. return View(vm);
  66. }
  67. // 用户登录
  68. await _signInManager.SignInAsync(user,false);
  69. return Redirect(vm.ReturnUrl);
  70. }

添加注册页面ExternalRegister

  1. @model ExternalRegisterViewModel
  2. <form asp-controller="IdentityCodeAuth" asp-action="ExternalRegister" method="post">
  3. <input type="hidden" asp-for="ReturnUrl" />
  4. <div>
  5. <label>Username</label>
  6. <input asp-for="Username" />
  7. <span asp-validation-for="Username"></span>
  8. </div>
  9. <div>
  10. <button type="submit">Register In</button>
  11. </div>
  12. </form>

运行测试

我们发现邮箱仍然没有出来,接着我们只需要添加邮箱相关资源即可。



然后再运行一次


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

荔枝大娘

2021/1/20 19:28:51

[给力]

css实现简单矩形对话框

在前端做项目时,我们可能会遇到写对话框的需求,这次做视频会议页面就遇到了,记录下日后有个参照。//网页部分 &lt;divcla...

.net实现QQ邮箱发送邮件功能

1、微软已经帮我们封装好了发送邮件的类MailMessage,MailMessage类构造一些邮件信息,然后通过SmtpClient进行邮件发送。Mai...

网页上传文件断点续传的实现,无视文件大小上传,以及datatables基本用法

首先明白js是客户带执行代码,c#是服务器上执行代码。本地文件需要用到js处理,服务器端接受c#代码处理1.HTML页面,文件信...

javascript阻止scroll事件多次执行的思路及实现

//测试代码 window.onscroll=function(){ alert(&quot;haha&quot;); }鼠标滑动之后一直点击提示框才可以,我想要的是鼠...

实现返回顶部效果

实现返回顶部效果2:http://www.tnblog.net/aojiancc2/article/details/2677实现的效果如下可以点击它返回到首页去html部分...

Vue.js+Layer实现表格数据绑定与更新

一:使用Vue.js绑定好数据与更新事件 使用v-on绑定好事件,在事件里边直接把该行数据传递进去,在更新方法里边就可以直接...

ASP.net 使用Redis实现单点登录

Session介绍 session是用来记录客户端用户信息的,在客户端第一次向服务器发起请求的时候服务器会生成一个sessionid并返回...

Vue.js 实现省市联动

HTML代码&lt;divid=&quot;pro_citys&quot;&gt; 省:&lt;selectid=&quot;provice&quot;v-on:change=&quot;prochange()&quo...

c使用unity实现依赖注入一:依赖注入介绍

依赖注入的简单介绍直接关联是这样滴,耦合性超高的。这里有一个设计原则:依赖于抽象,而不是具体的实现试想一下如果做了...

c使用unity实现依赖注入二:基本使用

使用Unity实现依赖注入的基本步骤:1:需要创建一个容器2:给容器添加类与类之间的关系(控制反转)3: 在需要的地方从容器里...

c使用unity实现依赖注入三:unity常用生命周期

常用的生命周期有瞬时模式,单利模式,每个线程一个对象模式等。一:TransientLifetimeManagerTransientLifetimeManager模...

c使用unity实现依赖注入四:unity配置文件注入

需要用到的配置文件一:先向xml申明一下unity的配置文件所在的实现类&lt;configSections&gt; &lt;sectionname=&quot;unity...

干货!div滚动到一定位置就固定他。Vue中实现一侧滚动到底部就固定

尊重原创:转载请注名出处div滚动到一定位置就固定他,例如左边的内容很多,右边的内容很少,如果不处理滚动到一定位置后右...

渣渣学安卓之登录摸索及页面效果实现

(背景)过完年来,一脸懵逼状态下开始的安卓学习,学错的求解勿喷。创建了个安卓下载地址 有需要的可以直接下载安装链接:...

渣渣学安卓之ScrollView控件实现屏幕上下滚动

android实现屏幕上下滚动有个ScrollView控件,拖动控件自带LinearLayout, 把需要滑动的页面放在LinearLayout其下即可。&lt...
这一世以无限游戏为使命!
排名
2
文章
662
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术