
.net core 3.1 Identity Server4 (实现GitHub登录)
创建GitHub应用
在下面进行身份授权的时候,我去掉了Webhook
添加了邮箱的读取。
添加相关代码
添加相关依赖库
Install-Package AspNet.Security.OAuth.GitHub -Version 3.1.6
在Startup
中,添加Github相关扩展
services.AddAuthentication()
.AddGitHub(options =>
{
options.ClientId = "your_ClientId";
options.ClientSecret = "your_ClientSecret";
// 添加 email
options.Scope.Add("user:email");
});
扩展登录相关代码
在LoginViewModel
实体中,添加扩展登录ExternalProviders
属性。
/// <summary>
/// 获取第三方登录扩展
/// </summary>
public IEnumerable<AuthenticationScheme> ExternalProviders { get; set; }
添加第三方登录注册类ExternalRegisterViewModel
public class ExternalRegisterViewModel
{
public string Username { get; set; }
public string ReturnUrl { get; set; }
}
在IdentityCodeAuthController
控制器中修改登录内容
[HttpGet]
public async Task<IActionResult> Login(string returnUrl)
{
var vm = new LoginViewModel() { ReturnUrl = returnUrl };
// 获取上下文的内容
var context = await _interaction.GetAuthorizationContextAsync(returnUrl);
vm.Username = context?.LoginHint;
// 获取第三方登录扩展
var externalProviders = await _signInManager.GetExternalAuthenticationSchemesAsync();
vm.ExternalProviders = externalProviders;
return View(vm);
}
在前台添加显示扩展显示标签。
<!-- 外部登录展示 -->
<form asp-controller="IdentityCodeAuth" asp-action="ExternalLogin" asp-route-returnUrl="@Model.ReturnUrl" method="post">
@foreach (var provider in Model.ExternalProviders)
{
<button name="provider" type="submit" value="@provider.Name">@provider.Name</button>
}
</form>
在添加第三方验证
/// <summary>
/// 第三方登录扩展处理
/// </summary>
/// <param name="returnUrl"></param>
/// <returns></returns>
public async Task<IActionResult> ExternalLogin(string provider, string returnUrl)
{
// 制作回调地址
var redirectUri = Url.Action(nameof(ExteranlLoginCallback), "IdentityCodeAuth", new { returnUrl });
var properties = _signInManager.ConfigureExternalAuthenticationProperties(provider,redirectUri);
return Challenge(properties, provider);
}
/// <summary>
/// 重定向到外部登录问题
/// </summary>
/// <returns></returns>
public async Task<IActionResult> ExteranlLoginCallback(string returnUrl)
{
// 获取外部信息
var info = await _signInManager.GetExternalLoginInfoAsync();
// 当我们获取不到就将它跳转回login页重新登录
if (info == null)
{
return RedirectToAction("Login");
}
// 获取相关信息
var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, false);
if (result.Succeeded)
{
return Redirect(returnUrl);
}
// 找不到就注册
var username = info.Principal.FindFirst(ClaimTypes.Name.Replace(" ", "_")).Value;
return View("ExternalRegister",new ExternalRegisterViewModel {
Username = username,
ReturnUrl = returnUrl
});
}
/// <summary>
/// 获取第三方注册处理
/// </summary>
/// <returns></returns>
public async Task<IActionResult> ExternalRegister(ExternalRegisterViewModel vm)
{
// 获取外部信息
var info = await _signInManager.GetExternalLoginInfoAsync();
// 当我们获取不到就将它跳转回login页重新登录
if (info == null)
{
return RedirectToAction("Login");
}
// 创建用户 (这里就没要密码)
var user = new IdentityUser(vm.Username);
// 获取邮箱
user.Email = info.Principal.Claims.FirstOrDefault(x => x.Type.Contains("email"))?.Value;
var result = await _userManager.CreateAsync(user);
if (!result.Succeeded)
{
return View(vm);
}
// 向指定用户添加外部用户登录信息
result = await _userManager.AddLoginAsync(user, info);
if (!result.Succeeded)
{
return View(vm);
}
// 用户登录
await _signInManager.SignInAsync(user,false);
return Redirect(vm.ReturnUrl);
}
添加注册页面ExternalRegister
@model ExternalRegisterViewModel
<form asp-controller="IdentityCodeAuth" asp-action="ExternalRegister" method="post">
<input type="hidden" asp-for="ReturnUrl" />
<div>
<label>Username</label>
<input asp-for="Username" />
<span asp-validation-for="Username"></span>
</div>
<div>
<button type="submit">Register In</button>
</div>
</form>
运行测试
我们发现邮箱仍然没有出来,接着我们只需要添加邮箱相关资源即可。
然后再运行一次
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739
评价
排名
2
文章
662
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 :
好是好,这个对效率影响大不大哇,效率高不高
一个bug让程序员走上法庭 索赔金额达400亿日元
剑轩 : 有点可怕
ASP.NET Core 服务注册生命周期
剑轩 :
http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:
50010702506256


欢迎加群交流技术
荔枝大娘