asp.net核心身份提取并保存外部登录令牌并添加对本地身份的声明
我是一个stackoverflow noob,所以如果我做错了,请放轻松.
我正在使用带有默认核心身份模板(本地帐户)的asp.net核心. 我已经加入了如何在本地登录时向用户主体添加声明的方式 [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task<IActionResult> Login(LoginInputModel model) { if (ModelState.IsValid) { // This doesn't count login failures towards account lockout // To enable password failures to trigger account lockout,set lockoutOnFailure: true var user = await _userManager.FindByNameAsync(model.Email); await _userManager.AddClaimAsync(user,new Claim("your-claim","your-value")); 我已经弄清楚如何从外部登录返回索赔但我无法弄清楚如何在ExternalLoginCallback函数中创建用户主体之前添加这些索引 public async Task<IActionResult> ExternalLoginCallback(string returnUrl = null,string remoteError = null) { if (remoteError != null) { ModelState.AddModelError(string.Empty,$"Error from external provider: {remoteError}"); return View(nameof(Login)); } var info = await _signInManager.GetExternalLoginInfoAsync(); if (info == null) { return RedirectToAction(nameof(Login)); } else { // extract claims from external token here } // assume add claims to user here before cookie gets created?? // Sign in the user with this external login provider if the user already has a login. var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider,info.ProviderKey,isPersistent: false); if (result.Succeeded) 我假设_signInManager.ExternalLoginSignInAsync函数的工作方式类似于本地登录_signInManager.PasswordSignInAsync,因为一旦调用它,就会创建cookie.但我不确定. 基本上我希望实现的是理解如何将自定义声明添加到创建的cookie中,无论用户如何登录(本地或外部),以及如何在需要时将这些声明持久保存到数据库中. 我打算做一些工作,如果我使用google auth进行用户登录,我需要从google保存该access_token,因为我希望稍后使用它来调用Google API.因此,我需要能够将此access_token包含在已创建的用户主体中,并且我希望cookie可以对其进行声明,我也可以在前端使用. 这可能超出了这个问题的范围,但我也想在谷歌令牌到期时,对于某些人 – 如何使用刷新令牌并获得新的令牌,或强迫用户重新登录. 任何有关这方面的帮助都会非常感激,我真的很难理解这一点,而不将这个问题发布到stackoverflow.我阅读了很多有用信息的文章,但没有提供这个具体问题的答案.非常感谢您提前. 干杯 解决方法
当你使用await _userManager.AddClaimAsync(用户,新索赔(“你的索赔”,“你的价值”));实际上更新了Identity的aspnetuserclaims表.
无论何时登录(通过使用_signInManager.PasswordSignIn或_signInManager.ExternalLoginSignInAsync),都会读取该表中的声明,并将其添加到每个请求成为Principal的cookie中. 因此,您可能不希望在每次登录时都从UserManager调用AddClaimAsync方法. 关于外部登录提供程序,您可以在此处访问声明(如果使用默认模板,则在ExternalCallback和ExternalCallbackConfirmation中): var info = await _signInManager.GetExternalLoginInfoAsync(); 索赔是在info.Principal.Claims. 默认情况下不包括访问令牌.如果是,它将在这里(连同类型和到期日期): var accessToken = info.AuthenticationTokens.Single(f => f.Name == "access_token").Value; var tokenType = info.AuthenticationTokens.Single(f => f.Name == "token_type").Value; var expiryDate = info.AuthenticationTokens.Single(f => f.Name == "expires_at").Value; 要将访问令牌包含在AuthenticationTokens集合中,在配置GoogleAuthentication中间件时,请将SaveTokens标志设置为true: app.UseGoogleAuthentication(new GoogleOptions{ ClientId = "...",ClientSecret = "...",SaveTokens = true 现在,如果您想要控制cookie中的哪些声明,您必须“接管”创建声明主体的过程. 当您使用_signInManager.PasswordSignIn / ExternalLoginSignInAsync时,这将为您完成. 因此,例如,对于ExternalLoginSignInAsync替换: var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider,isPersistent: false); 附: var user = await this._userManager.FindByLoginAsync(info.LoginProvider,info.ProviderKey); var claimsPrincipal = await this._signInManager.CreateUserPrincipalAsync(user); ((ClaimsIdentity)claimsPrincipal.Identity).AddClaim(new Claim("accessToken",info.AuthenticationTokens.Single(t => t.Name == "access_token").Value)); await HttpContext.Authentication.SignInAsync("Identity.Application",claimsPrincipal); “Identity.Application”是默认的cookie名称.您可以在Startup的ConfigureServices方法中更改它,例如更改为MainCookie: services.Configure<IdentityOptions>(options => { options.Cookies.ApplicationCookie.AuthenticationScheme = "MainCookie"; }); 您仍然需要在AccountController中处理ExternalCallbackConfirmation操作.它将类似于上面的例子. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 如何根据用户角色启用和禁用按钮?
- asp.net-mvc – 元素’标题’出现次数太少,ASP.NET.MVC母版
- asp.net-mvc – ASP.NET MVC:让API控制器操作同时返回View
- asp.net – 使用Oauth令牌获取Google分析数据?
- asp.net – Orchard – 从主题布局中获取内容的标题
- 如何在ASP.NET MVC4 Web API中捕获未定义的api方法调用
- entity-framework – IdentityServer 3 Asp.net身份:范围,
- asp.net-mvc – 在ASP .NET MVC 3中使用XSLT
- asp现场抽奖,asp微信现场抽奖功能代码
- .Net使用RabbitMQ
- .net – StructureMap单例因参数而异吗?
- asp.net – 在HTTP POST IIS ASP .NET上出现HTTP
- asp.net-mvc – ASP.Net MVC Razor Views – 在构
- 将自定义属性添加到asp.NET RadioButton控件
- Apppool回收和带有线程的Asp.net?
- asp.net-mvc – 如何在MVC Razor视图中查找编译时
- 在asp.net ajax工具包中组合脚本
- .net – CQRS EventSourcing可扩展性
- C#--图片上传(PC端和APP)保存及 跨域上传说明
- asp.net – Route属性上的RouteOrder属性在哪里?