Xamarin.ios 使用ADFS 3.0、ADAL、Web API和Xamarin刷新令牌

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令牌请求期间遇到错误

我们在使刷新令牌正常工作时遇到问题。最初,用户使用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应用程序中视图控制器的呼叫:

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尝试获取刷新令牌时,它应该会成功