OpenIddict-如何获取用户的访问令牌?我正在使用AngularJs为OpenIddict开发一个示例应用程序。有人告诉我你不应该使用像Satellizer这样的客户端框架,因为不推荐这样做,而是允许服务器在服务器端处理登录(本地和使用外部登录提供程序),然后返回访问令牌。我有一个演示angularJs应用程序并使用服务器端登录逻辑并回调到angular应用程序,但我的问题是,如何获取当前用户的访问令牌?这是我的startup.cs文件,所以你可以看到我到目前为止的配置服务.AddMvc();services.AddEntityFramework().AddSqlServer().AddDbContext(options=>options.UseSqlServer(configuration["Data:DefaultConnection:ConnectionString"]));services.AddIdentity().AddEntityFrameworkStores().AddDefaultTokenProviders().AddOpenIddict();服务.AddTransient();服务.AddTransient();}publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv){env.EnvironmentName="Development";varfactory=app.ApplicationServices.GetRequiredService();工厂.AddConsole();工厂.AddDebug();app.UseDeveloperExceptionPage();app.UseIISPlatformHandler(options=>{options.FlowWindowsAuthentication=false;});app.UseOverrideHeaders(选项s=>{options.ForwardedOptions=ForwardedHeaders.All;});app.UseStaticFiles();//添加用于验证访问权限的中间件//令牌并保护API端点。app.UseOAuthValidation();//将其注释掉,您会收到一条错误消息//InvalidOperationException:没有配置身份验证处理程序来处理方案:Microsoft.AspNet.Identity.Externalapp.UseIdentity();//TOO:移除app.UseGoogleAuthentication(options=>{options.ClientId="XXX";options.ClientSecret="XXX";});app.UseTwitterAuthentication(options=>{options.ConsumerKey="XXX";options.ConsumerSecret="XXX";});//注意:必须在//ASP.NETIdentity和外部提供程序之后添加OpenIddict。app.UseOpenIddict(options=>{options.Options.AllowInsecureHttp=true;options.Options.UseJwtTokens();});app.UseMvcWithDefaultRoute();使用(varcontext=app.ApplicationServices.GetRequiredService()){context.Database.EnsureCreated();//添加Mvc.Client到已知的应用程序。if(!context.Applications.Any()){context.Applications.Add(newApplication{Id="myClient",DisplayName="我的客户端应用程序",RedirectUri="http://localhost:5000/signin",LogoutRedirectUri="http://localhost:5000/",Secret=Crypto.HashPassword("secret_secret_secret"),Type=OpenIddictConstants.ApplicationTypes.Confidential});context.SaveChanges();现在我的AccountController基本上与普通帐户控制器相同,尽管一旦用户登录(使用本地和外部登录),我就使用此功能并需要accessTokenprivateIActionResultRedirectToAngular(){//我需要这里的accessTokenreturnRedirectToAction(nameof(AccountController.Angular),new{accessToken=token});}就像您在AccountController上的ExternalLoginCallback方法中看到的那样publicasyncTaskExternalLoginCallback(stringreturnUrl=null){varinfo=await_signInManager.GetExternalLoginInfoAsync();if(info==null){returnRedirectToAction(nameof(Login));}//如果用户已经登录,则使用此外部登录提供程序登录用户。varresult=await_signInManager.ExternalLoginSignInAsync(info.LoginProvider,info.ProviderKey,isPersistent:false);if(result.Succeeded){//用户现在应该拥有本地访问令牌吗?返回RedirectToAngular();}if(result.RequiresTwoFactor){returnRedirectToAction(nameof(SendCode),new{ReturnUrl=returnUrl});}if(result.IsLockedOut){returnView("Lockout");}else{//如果用户没有账号,则要求用户创建e一个帐户。ViewData["ReturnUrl"]=returnUrl;ViewData["LoginProvider"]=info.LoginProvider;varemail=info.ExternalPrincipal.FindFirstValue(ClaimTypes.Email);returnView("ExternalLoginConfirmation",newExternalLoginConfirmationViewModel{Email=email});}}varresult=await_signInManager.ExternalLoginSignInAsync(info.LoginProvider,info.ProviderKey,isPersistent:false);if(result.Succeeded){//用户现在应该拥有本地访问令牌吗?返回RedirectToAngular();}这不是它应该如何工作下面是经典流程中发生的事情:[1]:根据Satellizer文档,应该是这样的:以上是C#学习教程:OpenIddict-Howtogettheuser'saccesstoken?如果分享的内容对你有用,需要进一步了解C#学习教程,希望你多多关注——$authProvider.oauth2({name:'openiddict',clientId:'myClient',redirectUri:window.location.origin+'/done',authorizationEndpoint:window.location.origin+'/connect/authorize',responseType:'id_tokentoken',scope:['openid'],requiredUrlParams:['scope','nonce'],nonce:function(){return"TODO:implementappropriatenoncegenerationandvalidation";},popupOptions:{width:1028,height:529}});会员删除。如需转载请注明出处:
