You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 09:06:04