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

azure oauth azure-active-directory azure-webjobs adal

16027 观看

5回复

5236 作者的声誉

使用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;

AzureAdalCache这个要点中发布我的实现。

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;
作者: Ricardo Polo 的来源 发布者: 2015 年 4 月 20 日

回应 (5)


4

6509 作者的声誉

我听不懂电话:

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时使用的标识符/Controllers/TodoListController.cs

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

作者: vibronet 发布者: 20.04.2015 06:16

8

5236 作者的声誉

决定

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

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

作者: Ricardo Polo 发布者: 21.04.2015 09:53

1

353 作者的声誉

我在ASPNetCore(1.0)中遇到了同样的问题,原因是登录后我没有存储身份验证令牌。我通过添加OnAuthorizationCodeReceivedStartup类并将Response 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

作者: teocomi 发布者: 13.10.2016 01:47

1

2345 作者的声誉

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

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);
                    }
作者: Kurkula 发布者: 08.03.2017 06:37

0

93 作者的声誉

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

作者: ScottFoster1000 发布者: 06.11.2018 05:54
32x32