WebForm应用SSO集成报错:找不到GetUserInfoAsync方法
解决WebForm SSO中调用GetUserInfoAsync的方法未找到异常
这个错误本质是NuGet包版本不兼容导致的方法签名不匹配,IdentityModel的版本和你使用的Owin身份验证包版本对不上,使得运行时找不到对应的GetUserInfoAsync重载方法。下面是具体的解决步骤:
1. 检查并对齐NuGet包版本
首先查看你项目中以下几个关键包的版本:
IdentityModelMicrosoft.Owin.Security.OpenIdConnectMicrosoft.Owin.Security.Cookies
Owin 4.x系列的包通常和IdentityModel 4.x版本兼容,如果你用了太新的IdentityModel(比如6.x+),它的API已经发生了大幅变化,和旧版Owin中间件不兼容。建议你统一到兼容的版本组合,比如:
- 安装
IdentityModel 4.1.1 - 安装
Microsoft.Owin.Security.OpenIdConnect 4.2.2
你可以通过NuGet包管理器卸载现有版本后重新安装,或者用Package Manager Console执行:
Uninstall-Package IdentityModel -Force Uninstall-Package Microsoft.Owin.Security.OpenIdConnect -Force Install-Package IdentityModel -Version 4.1.1 Install-Package Microsoft.Owin.Security.OpenIdConnect -Version 4.2.2
2. 调整GetUserInfoAsync的调用代码
根据你安装的IdentityModel版本,调整方法调用的签名:
如果你用的是IdentityModel 4.x版本
可以显式传递取消令牌,或者使用简化的重载:
var userInfoResponse = await client.GetUserInfoAsync( new UserInfoRequest { Address = disco.UserInfoEndpoint, Token = n.ProtocolMessage.AccessToken }, CancellationToken.None);
或者更简洁的版本:
var userInfoResponse = await client.GetUserInfoAsync(disco.UserInfoEndpoint, n.ProtocolMessage.AccessToken);
如果你升级到了较新的IdentityModel版本(比如5.x+)
需要调整为新的API写法,比如使用UserInfoClient:
var userInfoClient = new UserInfoClient(disco.UserInfoEndpoint); var userInfoResponse = await userInfoClient.GetAsync(n.ProtocolMessage.AccessToken);
3. 调试中间件的小技巧
因为中间件里调试不方便,你可以添加日志输出定位问题:
// 在获取disco之后添加日志 Trace.WriteLine($"UserInfoEndpoint: {disco.UserInfoEndpoint}"); Trace.WriteLine($"Access Token: {n.ProtocolMessage.AccessToken}"); // 调用GetUserInfoAsync之前加try-catch捕获详细异常 try { var userInfoResponse = await client.GetUserInfoAsync(...); } catch(Exception ex) { Trace.WriteLine($"GetUserInfo Error: {ex.ToString()}"); throw; }
这样你可以在输出窗口看到详细的错误信息,帮助定位问题。
内容的提问来源于stack exchange,提问作者Tarta
相关产品推荐
相关产品推荐

