14

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

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

静默获取令牌失败。调用方法 AcquireToken

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

我创建了一个上下文

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;

我在这个 GistAzureAdalCache中发布了我的实现。

Cache的每一项都是这样的。

我错过了什么?

更新

根据@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;
4

5 回答 5

8

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

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

于 2015-04-21T09:53:21.873 回答
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中调用 AcquireTokenSilent 时使用的标识符/控制器/TodoListController.cs

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

于 2015-04-20T06:16:56.190 回答
1

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

希望能帮助到你。

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

于 2016-10-13T13:47:49.237 回答
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);
                    }
于 2017-03-08T18:37:11.393 回答
0

这是一个老问题 - 但对我来说,我需要清除客户端上的 cookie,然后它强制浏览器重新验证,一切都很好。

于 2018-11-06T17:54:07.343 回答