我正在开发一个在我的Azure AD上注册的多租户应用程序,它使用Office 365 apis,Graph API等。
我跟着this Microsoft sample构建了我的工作,它使用了ADAL .NET库和OpenIdConnect: Microsoft.IdentityModel.Clients.ActiveDirectory,Version = 2.19.0.0
在ADAL.NET中,我们使用 AuthenticationContext 实例和 TokenCache 的自定义继承类(请参阅code the sample code here)。
对于对授权资源的每个请求,根据API,我们调用其中一种方法(请参阅下面的代码)以获取将放入请求 Bearer <的 auth_token / em>参数。这是正确的方法吗?
我们从不使用方法 AcquireTokenByRefreshTokenAsync ,这是否意味着我们的应用程序从不使用 refresh_token ?这是否意味着我们的用户必须在一小时后重新登陆?我们应该在catch语句中使用 AcquireTokenByRefreshTokenAsync 实现一种刷新过程吗?可以在不向最终用户提示任何内容的情况下制作吗?
备注:我发布了一个关于OpenIdConnect authentication ticket lifetime的问题。对我来说,这两个问题是无关的,但可能是。
string signInUserId = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value;
string userObjectId = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;
string tenantId = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid").Value;
public async Task<string> AcquireOutlook365TokenAsync()
{
AuthenticationContext authContext = new AuthenticationContext(string.Format("{0}/{1}", SettingsHelper.AuthorizationUri, tenantId), new ADALTokenCache(signInUserId));
try
{
var result = await authContext.AcquireTokenSilentAsync(@"https://outlook.office365.com/",
new ClientCredential(SettingsHelper.ClientId, SettingsHelper.AppKey),
new UserIdentifier(userObjectId, UserIdentifierType.UniqueId));
return result.AccessToken;
}
catch (AdalException exception)
{
//handle token acquisition failure
if (exception.ErrorCode == AdalError.FailedToAcquireTokenSilently)
{
authContext.TokenCache.Clear();
}
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.Unauthorized));
}
}
public async Task<string> AcquireAzureGraphTokenAsync()
{
AuthenticationContext authContext = new AuthenticationContext(string.Format("{0}/{1}", SettingsHelper.AuthorizationUri, tenantId), new ADALTokenCache(signInUserId));
try
{
var result = await authContext.AcquireTokenSilentAsync(@"https://graph.windows.net/",
new ClientCredential(SettingsHelper.ClientId, SettingsHelper.AppKey),
new UserIdentifier(userObjectId, UserIdentifierType.UniqueId));
return result.AccessToken;
}
catch (AdalException exception)
{
//Same as other method
}
}
答案 0 :(得分:4)
ADAL自动且透明地使用存储的刷新令牌,您不需要执行任何显式操作。由于遗留原因,AcquireTOkenByRefreshToken位于ADAL表面,已从版本3.x中删除。 http://www.cloudidentity.com/blog/2015/08/13/adal-3-didnt-return-refresh-tokens-for-5-months-and-nobody-noticed/
的更多背景信息