如何让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
相关产品推荐
相关产品推荐

