使用 Microsoft.IdentityModel.Clients.ActiveDirectory 在 AuthenticationContext 实例上调用 AcquireTokenByRefreshToken 时?
When calling AcquireTokenByRefreshToken on the AuthenticationContext instance with Microsoft.IdentityModel.Clients.ActiveDirectory?
我正在开发一个在我的 Azure AD 上注册的多租户应用程序,该应用程序使用 Office 365 api、Graph API 等
我按照 this Microsoft sample 构建了我的作品,它使用 ADAL .NET 库和 OpenIdConnect:Microsoft.IdentityModel.Clients.ActiveDirectory,版本=2.19.0.0
在 ADAL.NET 中,我们使用 AuthenticationContext 实例,其中自定义继承 class 用于 TokenCache (参见 code the sample code here)。
对于授权资源的每个请求,根据 API,我们调用这些方法之一(见下面的代码)来获取 auth_token 将被放入请求 Bearer 参数中。这是正确的方法吗?
我们从不使用 AcquireTokenByRefreshTokenAsync 方法,这是否意味着我们的应用程序从不使用 refresh_token?这是否意味着我们的用户必须在一小时后重新登录?我们是否应该在 catch 语句中使用 AcquireTokenByRefreshTokenAsync 实现一种刷新过程?可以在不提示最终用户的情况下制作吗?
备注:我发布了一个关于 的问题。对我来说,这两个问题是无关的,但它们可能是。
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
}
}
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/
处有更多背景资料
我正在开发一个在我的 Azure AD 上注册的多租户应用程序,该应用程序使用 Office 365 api、Graph API 等
我按照 this Microsoft sample 构建了我的作品,它使用 ADAL .NET 库和 OpenIdConnect:Microsoft.IdentityModel.Clients.ActiveDirectory,版本=2.19.0.0
在 ADAL.NET 中,我们使用 AuthenticationContext 实例,其中自定义继承 class 用于 TokenCache (参见 code the sample code here)。
对于授权资源的每个请求,根据 API,我们调用这些方法之一(见下面的代码)来获取 auth_token 将被放入请求 Bearer 参数中。这是正确的方法吗?
我们从不使用 AcquireTokenByRefreshTokenAsync 方法,这是否意味着我们的应用程序从不使用 refresh_token?这是否意味着我们的用户必须在一小时后重新登录?我们是否应该在 catch 语句中使用 AcquireTokenByRefreshTokenAsync 实现一种刷新过程?可以在不提示最终用户的情况下制作吗?
备注:我发布了一个关于
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
}
}
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/
处有更多背景资料