Xamarin.ios 使用ADFS 3.0、ADAL、Web API和Xamarin刷新令牌
我们在使刷新令牌正常工作时遇到问题。最初,用户使用ADAL的web视图登录,并获得一个令牌。该令牌用于调用Web API,直到其过期。与我们预期的在没有web提示符的情况下获取新令牌不同,服务器上会记录一个错误,并再次向用户显示登录web提示符 根据我们所阅读的内容,您应该在每次调用中使用AcquireTokenAsync,并让ADAL处理令牌/刷新令牌 下面是当ADAL尝试使用刷新令牌获取新令牌时,我们在服务器上遇到的错误。我们已尝试搜索该错误,但没有找到太多 OAuth令牌请求期间遇到错误 附加数据 例外情况详情: Microsoft.IdentityServer.Web.Protocols.OAuth.Exceptions.OAuthInvalidScopeException: MSIS9330:收到的OAuth访问令牌请求无效。A. 请求中收到了“scope”参数,但AD FS未收到 支持任何范围。收到的作用域:“openid”。在 Microsoft.IdentityServer.Web.Protocols.OAuth.OAuthToken.OAuthRefreshTokenRequestContext.Validate() 我们错过什么了吗?是否有一种方法可以设置范围,或者这对我们正在使用的当前版本不起作用?ADAL是向ADFS服务器发送带有作用域的帖子的人 我们没有使用Azure广告强> 来自iOS应用程序中视图控制器的呼叫:Xamarin.ios 使用ADFS 3.0、ADAL、Web API和Xamarin刷新令牌,xamarin.ios,asp.net-web-api2,adal,adfs3.0,Xamarin.ios,Asp.net Web Api2,Adal,Adfs3.0,我们在使刷新令牌正常工作时遇到问题。最初,用户使用ADAL的web视图登录,并获得一个令牌。该令牌用于调用Web API,直到其过期。与我们预期的在没有web提示符的情况下获取新令牌不同,服务器上会记录一个错误,并再次向用户显示登录web提示符 根据我们所阅读的内容,您应该在每次调用中使用AcquireTokenAsync,并让ADAL处理令牌/刷新令牌 下面是当ADAL尝试使用刷新令牌获取新令牌时,我们在服务器上遇到的错误。我们已尝试搜索该错误,但没有找到太多 OAuth令牌请求期间遇到错误
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"],
},
}
}
以下是我们的作品:
- 带ADFS 3.0的Windows Server 2012 R2(内部部署)
- 寿命=60
- 令牌寿命(依赖方)=10
- ADAL 3.13.8
- .NETWebAPI
- Xamarin iOS应用程序
问题出在ADAL源代码中。服务器日志中的错误非常具体: 请求中接收到“scope”参数,AD FS不支持任何作用域。收到的作用域:“openid”。ADAL库在尝试获取刷新令牌时发送范围参数。ADFS 3.0不支持openid作用域,因此失败 从github下载ADAL代码-- 打开位于此处的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;
}
受保护的异步任务
现在,当ADAL尝试获取刷新令牌时,它应该会成功