使用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;
答案 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
。
希望它有所帮助。
答案 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,然后迫使浏览器重新进行身份验证,一切恢复正常。