我们在让刷新令牌工作时遇到问题。最初,用户使用ADAL的Web视图登录并获取令牌。该令牌用于调用Web API,直到它过期。我们没有像我们期望的那样在没有Web提示的情况下获取新令牌,而是在服务器上记录错误,并且再次向用户显示登录Web提示。
根据我们的阅读,您应该在每次调用时使用AcquireTokenAsync,并让ADAL处理令牌/刷新令牌。
以下是ADAL尝试使用刷新令牌获取新令牌时在服务器上获得的错误。我们已尝试搜索该错误但却找不到多少。
OAuth令牌请求期间遇到错误。
其他数据
异常详情: Microsoft.IdentityServer.Web.Protocols.OAuth.Exceptions.OAuthInvalidScopeException: MSIS9330:收到的OAuth访问令牌请求无效。一个 '范围'在请求中收到参数,AD FS没有 支持任何范围。收到的范围:' openid'。在 Microsoft.IdentityServer.Web.Protocols.OAuth.OAuthToken.OAuthRefreshTokenRequestContext.Validate()
我们错过了什么吗?有没有办法设置范围,或者这不适用于我们使用的当前版本? ADAL是将范围发布到ADFS服务器的那个。
我们不使用Azure AD!
来自iOS应用中视图控制器的调用:
PlatformParameters p = new PlatformParameters(this);
AuthenticationContext authContext = new AuthenticationContext("https://adfs.domain.com/adfs", false);
AuthenticationResult _authResult = await authContext.AcquireTokenAsync("https://webapi.domain.com", "E1CF1107-FF90-4228-93BF-26052DD2C714", “http://anarbitraryreturnuri/”, p);
Web API中的Startup.Auth.cs:
public void ConfigureAuth(IAppBuilder app)
{
app.UseActiveDirectoryFederationServicesBearerAuthentication(
new ActiveDirectoryFederationServicesBearerAuthenticationOptions
{
MetadataEndpoint = ConfigurationManager.AppSettings["ida:AdfsMetadataEndpoint"],
TokenValidationParameters = new TokenValidationParameters()
{
ValidAudience = ConfigurationManager.AppSettings["ida:Audience"],
},
}
}
以下是我们的作品:
以下是我们过去使用的一些帖子:
答案 0 :(得分:1)
问题出在ADAL源代码中。服务器日志中的错误非常具体:
A'范围'请求中收到参数,AD FS不支持任何范围。收到范围:' openid '。 ADAL库在尝试获取刷新令牌时发送scope参数。 ADFS 3.0不支持openid作用域,因此失败。
从github下载ADAL代码 - https://github.com/AzureAD/azure-activedirectory-library-for-dotnet
打开位于此处的AcquireTokenHandlerBase.cs:
从SendTokenRequestByRefreshTokenAsync调用中删除范围:
protected async Task<AuthenticationResultEx> SendTokenRequestByRefreshTokenAsync(string refreshToken)
{
var requestParameters = new DictionaryRequestParameters(this.Resource, this.ClientKey);
requestParameters[OAuthParameter.GrantType] = OAuthGrantType.RefreshToken;
requestParameters[OAuthParameter.RefreshToken] = refreshToken;
//requestParameters[OAuthParameter.Scope] = OAuthValue.ScopeOpenId; **This line causes refresh to fail**
AuthenticationResultEx result = await this.SendHttpMessageAsync(requestParameters).ConfigureAwait(false);
if (result.RefreshToken == null)
{
result.RefreshToken = refreshToken;
PlatformPlugin.Logger.Verbose(this.CallState,
"Refresh token was missing from the token refresh response, so the refresh token in the request is returned instead");
}
return result;
}
清理并重建项目。用新DLL替换nuget引用。确保在Xamarin iOS项目中包含平台DLL。
现在,当ADAL尝试获取刷新令牌时,它应该会成功。