我们正在尝试评估多个身份提供者。对于 POC 设置一个小型 Web 应用程序,使用 IdentityModel 编写。当针对当前身份提供者在本地运行时(至少我被告知),它可以成功地进行身份验证和授权。它可以在开发人员笔记本电脑上使用 Visual Studio 和 IIS Express 正常工作。
当我将开发环境之外的应用程序发布到 POC 时,问题就开始了。应用程序发送用户名/密码并成功启动会话,但它没有收到授权令牌。结果,Web 应用程序因空令牌异常而停止。
IIS 在与开发环境相同的端口和主机上运行应用程序:https://localhost:44307,使用相同的自签名 SSL 证书。
在哪里进一步挖掘?什么是错误的 IIS 配置或应用程序中的什么?
使用 Keycloak,我们发现问题可能与标头发送的 OAuth 授权凭据有关,但 WSO2 似乎同时接受正文和标头方法。我能够使用 Postman 验证身份服务功能并接收令牌,因此身份服务应该可以工作。
WSO2 日志上没有错误。日志条目仅显示为回调 URL 颁发了授权代码。与令牌无关。
public async Task<RedirectResult> LoggedIn()
{
var authorizeResponse = new AuthorizeResponse(Request.RawUrl);
// Create the TokenClient
var client = new TokenClient(
TokenEndpoint,
ClientId,
ClientSecret);
// Request the access token
var response = await client.RequestAuthorizationCodeAsync(
authorizeResponse.Code,
RedirectUrl);
System.IO.File.AppendAllText(AppDomain.CurrentDomain.BaseDirectory + "\\log.txt", response.Raw + "\n");
var claims = ValidateLocally
? ValidateWithHmacOrRsa(response.AccessToken)
: await ValidateWithUserInfoEndpointAsync(response.AccessToken);
Session["claims"] = claims;
Session["identityToken"] = response.IdentityToken;
return Redirect("~/");
}
预计会获得 OAuth 客户端的授权令牌。相反,在应用程序的调试日志中,我确实看到:
Connection=close&Accept=text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8&Accept-Encoding=gzip, deflate, br&Accept-Language=en-US,en;q=0.5&Host=localhost:44307&Referer=https://wso2-1.wso.local:9443/authenticationendpoint/login.do?client_id=gfvUfDTN7bnfJkWW2Z4wXvAV9Dsa&commonAuthCallerPath=/oauth2/authorize&forceAuth=false&passiveAuth=false&redirect_uri=https://localhost:44307/auth/loggedin&response_type=code&scope=openid&tenantDomain=carbon.super&sessionDataKey=687f20cf-7224-4586-8a97-b11e466ac19d&relyingParty=gfvUfDTN7bnfJkWW2Z4wXvAV9Dsa&type=oidc&sp=hellome-local&isSaaSApp=false&authenticators=BasicAuthenticator:LOCAL&TE=trailers&User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0&upgrade-insecure-requests=1
浏览器和 Windows 事件日志显示
Exception Details: System.ArgumentNullException: Value cannot be null.
Parameter name: token
...
Stack Trace:
[ArgumentNullException: Value cannot be null.
Parameter name: token]
IdentityModel.Client.<GetAsync>d__6.MoveNext() +795
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() +31
...