当前位置: 首页 > 编程语言 > C#

ASP.NETIdentity(使用IdentityServer4)获取外部资源OauthAccessToken分享

时间:2023-04-10 12:06:47 C#

ASP.NETIdentity(使用IdentityServer4)获取外部资源OauthAccessToken我翻了identityServer4的文档,把它设置好了最多使用MicrosoftOffice365作为登录提供程序。当用户登录时,我想创建一个按钮,他可以让我的应用程序使用graph.microsoft.com的webhooksapistartup.cs中的代码app.UseMicrosoftAccountAuthentication(newMicrosoftAccountOptions{AuthenticationScheme="Microsoft",DisplayName="Microsoft",SignInScheme=IdentityServerConstants.ExternalCookieAuthenticationScheme,ClientId="CLIENTID",ClientSecret="CLIENTSECRET",CallbackPath=newPathString("/signin-microsoft"),Events=newOAuthEvents{OnCreatingTicket=context=>{redisCache.Set("AccessToken",context.AccessToken.GetBytes(),newDistributedCacheEntryOptions{AbsoluteExpiration=DateTimeOffset.UtcNow.AddDays(3)});returnTask.FromResult(context);}}Scope={"Calendars.Read","Calendars.Read.Shared",},SaveTokens=true});但这显然不是一条可行的道路。我只是为了测试目的而制作这个,需要为订阅做一个PoC。现在我想知道是否有更智能的方式与IdentityServer通信,允许我获取此外部访问令牌,以便我可以代表我的登录用户使用Microsoftapi?或者我是直接从此OAuthEvent获取MicrosoftAccessToken并将其直接存储在链接到登录用户的数据库中的唯一选择吗?我真的需要这个,因为我的大部分功能都是基于第三方的数据。好的,所以我终于让它工作了。我使用ASP.NetIdentity和IdentityServer4创建了一个新项目,它们都构建在ASP.NetCore之上。问题是我不完全了解外部登录过程中使用的流程。如果您使用两个系统的锅板,您将拥有一个AccountController,其中将存在以下方法:////GET:/Account/ExternalLoginCallback[HttpGet][AllowAnonymous]publicasyncTaskExternalLoginCallback(stringreturnUrl=null,stringreturnUrl=null=null){if(remoteError!=null){ModelState.AddModelError(string.Empty,$"来自外部提供者的错误:{remoteError}");返回视图(名称(登录));}varinfo=await_signInManager.GetExternalLoginInfoAsync();if(info==null){returnRedirectToAction(nameof(Login));}//如果用户已经登录,则使用此外部登录提供程序登录用户。varresult=await_signInManager.ExternalLoginSignInAsync(info.LoginProvider,info.ProviderKey,isPersistent:false);如果(result.Succeeded){await_signInManager.UpdateExternalAuthenticationTokensAsync(info);_logger.LogInformation(5,"用户使用{Name}提供商登录。",info.LoginProvider);返回RedirectToLocal(returnUrl);}如果(result.RequiresTwoFactor){返回RedirectToAction(nameof(SendCode),new{ReturnUrl=returnUrl});}if(result.IsLockedOut){returnView("Lockout");}else{//如果用户没有账户,则要求用户创建一个账户。ViewData["ReturnUrl"]=returnUrl;ViewData["LoginProvider"]=info.LoginProvider;varemail=info.Principal.FindFirstValue(ClaimTypes.Email);returnView("ExternalLoginConfirmation",newExternalLoginConfirmationViewModel{Email=email});这里的重要部分是:await_signInManager.UpdateExternalAuthenticationTokensAsync(info);这会将外部凭证保存在与ASP.Net身份关联的数据库表中。在AspNetUserTokens表中,您现在将拥有3个条目:access_token、expires_at和token_type。这些是我们感兴趣的令牌,我们可以使用它来访问应用程序其他地方的用户凭据。要在登录用户的上下文中获取这些令牌:varexternalAccessToken=await_userManager.GetAuthenticationTokenAsync(User,"Microsoft","access_token");要为我们从数据库中获取的用户获取它们,我们可以使用:以上是C#学习教程:ASP.NETIdentity(使用IdentityServer4)获取外部资源oauth访问令牌共享的所有内容。如果对大家有用,需要了解更多C#学习教程,希望大家多多关注—varuser=_userManager.Users.SingleOrDefault(x=>x.Id=="myId");如果(用户==null)返回;varclaimsPrincipal=await_signInManager.CreateUserPrincipalAsync(user);varexternalAccessToken=await_userManager.GetAuthenticationTokenAsync(claimsPrincipal,"Microsoft","access_token");本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: