AcquireTokenSilent始终无法以静默方式获取令牌

时间:2015-04-20 06:06:01

标签: azure oauth azure-active-directory azure-webjobs adal

使用ADAL我有两个AuthenticationContext使用持久存在于SQL中的令牌缓存。

使用AcquireTokenByAuthorizationCode它会在数据库中写入令牌,但在使用AcquireTokenSilent时我总是得到

  

无法以静默方式获取令牌。调用方法AcquireToken

以下是复制问题的详细信息:

我创建了一个Context

AuthenticationContext authContext = new AuthenticationContext(_authority, new AzureAdalCache(companyId, _entries, _unitOfWork));

然后我通过授权获取授权

authContext.AcquireTokenByAuthorizationCode(authorizationCode, new Uri(redirectUri), _clientCredential);

此时,它会在数据库中保存一个条目

然后,如果我打电话给我,我会得到一个例外。

authContext.AcquireTokenSilent(_authority, _clientCredential, new UserIdentifier(companyId.ToString(), UserIdentifierType.UniqueId)).AccessToken;

我也试过了同样的结果:

authContext.AcquireTokenSilent(_authority, _clientId).AccessToken;
authContext.AcquireTokenSilent(_authority, _clientCredential, UserIdentifier.AnyUser).AccessToken;

我在this Gist发布了AzureAdalCache个实施内容。

缓存的每个条目都是like this

我错过了什么?

更新

根据@vibronet的评论回答我有这个

AuthenticationContext authContext = new AuthenticationContext(_authority, new AzureAdalCache(companyId, _entries, _unitOfWork));
authContext.AcquireTokenByAuthorizationCode(authorizationCode, new Uri(redirectUri), _clientCredential, _eWSResource);
string result = authContext.AcquireTokenSilent(_eWSResource, _clientId, UserIdentifier.AnyUser).AccessToken;

5 个答案:

答案 0 :(得分:8)

问题是基本上我在我的应用程序中使用了Common Authority https://login.windows.net/common/oauth2/authorize。它适用于AcquireTokenByAuthorizationCode(),但不适用于AcquireTokenSilent()。

因此,当调用AcquireTokenByAuthorizationCode()时,我需要它来保存TenantId,并且当调用AcquireTokenSilent()时,权限使用类似https://login.windows.net/<tenant ID>/oauth2/authorize的权限。这样,上面的代码就可以了。

答案 1 :(得分:4)

我不理解这个电话:

authContext.AcquireTokenSilent(
    _authority,
    _clientCredential,
    new UserIdentifier(companyId.ToString(), UserIdentifierType.UniqueId)
).AccessToken;

UserIdentifier必须与缓存中的值匹配,并且CompanyID听起来不像您为该令牌获取的任何标识符。

请查看我在另一个帖子上指出的示例,特别是在https://github.com/AzureADSamples/WebApp-WebAPI-OpenIDConnect-DotNet/blob/master/TodoListWebApp/Controllers/TodoListController.cs

中调用AcquireTokenSilent时使用的标识符

您无法选择在该通话中使用哪个标识符,这取决于AAD发布的声明。您可以选择的唯一标识符是缓存实例级别,而不是单独的AcquireToken *调用。

答案 2 :(得分:1)

我在ASPNetCore(1.0)中遇到了同样的问题,原因是登录后我没有存储身份验证令牌。我通过在Startup类中添加OnAuthorizationCodeReceived并更改响应来解决它ype到ResponseType = OpenIdConnectResponseType.CodeIdToken

希望它有所帮助。

样品: https://github.com/Azure-Samples/active-directory-dotnet-webapp-webapi-openidconnect-aspnetcore/blob/aspnet10/WebApp-WebAPI-OpenIdConnect-DotNet/Startup.cs#L100

答案 3 :(得分:1)

检查令牌是否存在于缓存中,否则退出并要求用户登录。

AuthenticationContext authContext = new AuthenticationContext(Startup.Authority,
                        new NaiveSessionCache(userObjectID));
                    if (authContext.TokenCache.Count == 0)
                    {
                        authContext.TokenCache.Clear();
                        CosmosInterface.Utils.AuthenticationHelper.token = null;
                        HttpContext.GetOwinContext().Authentication.SignOut(
                            OpenIdConnectAuthenticationDefaults.AuthenticationType,
                            CookieAuthenticationDefaults.AuthenticationType);
                    }

答案 4 :(得分:0)

这是一个古老的问题-但是对我来说,我需要清除客户端上的Cookie,然后迫使浏览器重新进行身份验证,一切恢复正常。