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

如何让Xero .NET Core OAuth2示例项目完成认证?

解决Xero OAuth2在.NET Core 3.1中无法跳转授权页面的问题

你遇到的这个问题我之前帮同行排查过,核心大概率是回调URL不匹配或者OIDC中间件配置细节没到位,结合你的排查步骤,给你几个针对性的解决方向:


1. 严格保证回调URL的完全一致

这是OAuth2认证最容易踩的坑:

  • 确认Xero MyApps里的重定向URI已经改成http://localhost:5000/signin_oidc,和你代码里的CallbackPath完全一致(包括协议、域名、端口、路径,甚至大小写都要匹配,Xero的校验很严格)
  • 建议在Xero后台删掉旧的signup-oidc重定向URI,只留当前使用的,避免混淆

2. 修正OIDC中间件的关键配置

在Startup.cs的ConfigureServices方法里,检查AddOpenIdConnect的配置是否包含以下关键项:

services.AddAuthentication(options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
    options.ClientId = Configuration["Xero:ClientId"];
    options.ClientSecret = Configuration["Xero:ClientSecret"];
    options.Authority = "https://login.xero.com/identity";
    options.ResponseType = "code"; // Xero OAuth2仅支持授权码流程
    options.CallbackPath = "/signin_oidc"; // 必须和Xero后台配置完全一致
    options.Scope.Clear();
    options.Scope.Add("openid");
    options.Scope.Add("profile");
    options.Scope.Add("email");
    options.Scope.Add("offline_access");
    options.Scope.Add("accounting.transactions"); // 替换成你实际需要的Xero API作用域
    options.SaveTokens = true; // 保存令牌到Cookie,方便后续调用API
    options.GetClaimsFromUserInfoEndpoint = true;
});

重点注意:

  • ResponseType必须设为code,不能用id_token或其他组合
  • Authority要准确指向Xero的身份服务根地址,不要额外拼接路径
  • SaveTokens设为true才能在后续请求中拿到访问令牌

3. 检查请求参数与浏览器错误信息

当点击SignIn跳转时,打开浏览器的开发者工具-网络面板,查看跳转到Xero的请求URL,确认:

  • client_id是否和你配置的一致
  • redirect_uri是否完全匹配Xero后台的配置
  • scope参数格式是否正确(多个作用域用空格分隔)
    如果跳转后没有显示登录页,查看浏览器控制台有没有JS报错,或者Xero返回的错误提示(比如参数错误会返回400状态码或直接显示错误页面)

4. 确认中间件执行顺序

在Startup.cs的Configure方法里,中间件顺序必须正确:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // ...其他中间件(比如UseStaticFiles)
    app.UseRouting();
    
    // 这两个中间件必须在UseEndpoints之前,且UseAuthentication在前
    app.UseAuthentication();
    app.UseAuthorization();
    
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
    });
}

顺序错误会导致认证流程无法正常触发。

5. XeroClient的正确初始化

不要提前注入未携带令牌的XeroClient实例,应该在认证成功后,从HttpContext获取令牌再初始化:

public class HomeController : Controller
{
    private readonly IConfiguration _configuration;

    public HomeController(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    public async Task<IActionResult> Index()
    {
        if (User.Identity.IsAuthenticated)
        {
            var accessToken = await HttpContext.GetTokenAsync("access_token");
            var xeroConfig = new XeroConfiguration
            {
                ClientId = _configuration["Xero:ClientId"],
                ClientSecret = _configuration["Xero:ClientSecret"]
            };
            var xeroClient = new XeroClient(xeroConfig);
            xeroClient.TokenSet = new TokenSet { AccessToken = accessToken };
            // 后续调用Xero API逻辑
        }
        return View();
    }
}

先按上面的步骤逐一排查,尤其是回调URL和OIDC配置这两项,大概率能解决你的问题。

内容的提问来源于stack exchange,提问作者Medismal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 17:42:27