ASP.NET Core配置OAuth回调出现远程登录错误该如何解决?
解决方案
第一步:修正客户端认证授权中间件顺序
客户端Startup.cs的Configure方法中,认证中间件必须放在授权中间件之前,否则OAuth回调请求无法被认证中间件正确捕获,就会抛出你遇到的远程登录处理错误。你无需手动配置回调路径的端点,OAuth中间件会自动处理/oauth/callback路径的请求,报错本质是中间件顺序错误导致的。
修正后的Configure代码:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseHttpsRedirection(); app.UseRouting(); // 先执行身份认证,再执行授权校验 app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapDefaultControllerRoute(); }); }
第二步:配置认证成功后跳转到Secret页面
在客户端OAuth配置中添加OnTicketReceived事件,指定认证成功后的跳转地址:
修改客户端ConfigureServices里的AddOAuth部分:
.AddOAuth("OurServer", config => { config.ClientId = "client_id"; config.ClientSecret = "client_secret "; config.CallbackPath = "/oauth/callback"; config.AuthorizationEndpoint = "http://localhost:4444/oauth/authorize"; config.TokenEndpoint = "http://localhost:4444/oauth/token"; // 新增事件配置跳转路径 config.Events = new OAuthEvents { OnTicketReceived = context => { // 认证成功后直接跳转到Home控制器的Secret动作 context.ReturnUri = "/Home/Secret"; return Task.CompletedTask; } }; });
第三步:修复服务端Token接口错误逻辑
你当前服务端OAuthController的Token方法在输出Token后执行了重定向,这不符合OAuth2.0规范,会导致客户端无法正常获取Token,修改该方法的返回逻辑:
public async Task<IActionResult> Token( string grant_type, string code, string redirect_uri, string client_id ) { var claims = new[] { new Claim(JwtRegisteredClaimNames.Sub, "some_id"), new Claim("granny", "cookie") }; var secretBytes = Encoding.UTF8.GetBytes(Constants.Secret); var key = new SymmetricSecurityKey(secretBytes); var algorithm = SecurityAlgorithms.HmacSha256; var signingCredentials = new SigningCredentials(key, algorithm); var token = new JwtSecurityToken( Constants.Issuer, Constants.Audience, claims, notBefore: DateTime.Now, expires: DateTime.Now.AddHours(1), signingCredentials ); var access_token = new JwtSecurityTokenHandler().WriteToken(token); var responseObject = new { access_token, token_type = "Bearer", raw_claim = "oauthtutorial" }; // 直接返回Json即可,移除原有的重定向逻辑 return Ok(responseObject); }
完成以上三步修改后,即可实现OAuth回调完成后自动跳转至客户端HomeController的Secret动作的需求。
内容的提问来源于stack exchange,提问作者noonecious
相关产品推荐
相关产品推荐

