使用ADFS 3.0,ADAL,Web API和Xamarin

时间:2017-02-13 16:29:37

标签: xamarin.ios asp.net-web-api2 adal adfs3.0

我们在让刷新令牌工作时遇到问题。最初,用户使用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"],
                    },
                }
        }

以下是我们的作品:

  • 带有ADFS 3.0的Windows Server 2012 R2(内部部署)
  • SsoLifetime = 60
  • TokenLifetime(依赖方)= 10
  • ADAL 3.13.8
  • .NET Web API
  • Xamarin iOS应用

以下是我们过去使用的一些帖子:

http://www.cloudidentity.com/blog/2013/10/25/securing-a-web-api-with-adfs-on-ws2012-r2-got-even-easier/

http://www.cloudidentity.com/blog/2015/08/13/adal-3-didnt-return-refresh-tokens-for-5-months-and-nobody-noticed/

1 个答案:

答案 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:

enter image description here

从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。

enter image description here

现在,当ADAL尝试获取刷新令牌时,它应该会成功。

enter image description here