- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个应用程序,用户在 Office365 中使用 AzureAD library for Android 进行身份验证.
它运作良好,用户可以验证并使用该应用程序。不幸的是,过了一会儿,他们开始使用 ADALError.AUTH_REFRESH_FAILED_PROMPT_NOT_ALLOWED
作为错误代码命中 AuthenticationException
。
我检查了 source code AzurelAD。唯一解决这个问题的地方是 acquireTokenAfterValidation()
方法:
private AuthenticationResult acquireTokenAfterValidation(CallbackHandler callbackHandle,
final IWindowComponent activity, final boolean useDialog,
final AuthenticationRequest request) {
Logger.v(TAG, "Token request started");
// BROKER flow intercepts here
// cache and refresh call happens through the authenticator service
if (mBrokerProxy.canSwitchToBroker()
&& mBrokerProxy.verifyUser(request.getLoginHint(),
request.getUserId())) {
.......
Logger.v(TAG, "Token is not returned from backgroud call");
if (!request.isSilent() && callbackHandle.callback != null && activity != null) {
....
} else {
// User does not want to launch activity
String msg = "Prompt is not allowed and failed to get token:";
Logger.e(TAG, msg, "", ADALError.AUTH_REFRESH_FAILED_PROMPT_NOT_ALLOWED);
callbackHandle.onError(new AuthenticationException(
ADALError.AUTH_REFRESH_FAILED_PROMPT_NOT_ALLOWED, msg));
}
// It will start activity if callback is provided. Return null here.
return null;
} else {
return localFlow(callbackHandle, activity, useDialog, request);
}
}
我的源代码:
authenticator.getAccessTokenSilentSync(getMailService());
public class Authenticator {
..............
public String getAccessTokenSilentSync(ServiceInfo serviceInfo) {
throwIfNotInitialized();
return getAuthenticationResultSilentSync(serviceInfo).getAccessToken();
}
private AuthenticationResult getAuthenticationResultSilentSync(ServiceInfo serviceInfo) {
try {
return authenticationContext.acquireTokenSilentSync(
serviceInfo.ServiceResourceId,
Client.ID,
userIdentity.getAdUserId());
} catch (AuthenticationException ex) {
// HERE THE EXCEPTION IS HANDLED.
}
}
..............
}
我得到的堆栈跟踪:
<package name>.data_access.error_handler.AuthenticationExceptionWithServiceInfo: Refresh token is failed and prompt is not allowed
at com.microsoft.aad.adal.AuthenticationContext.localFlow(AuthenticationContext.java:1294)
at com.microsoft.aad.adal.AuthenticationContext.acquireTokenAfterValidation(AuthenticationContext.java:1229)
at com.microsoft.aad.adal.AuthenticationContext.acquireTokenLocalCall(AuthenticationContext.java:1123)
at com.microsoft.aad.adal.AuthenticationContext.refreshToken(AuthenticationContext.java:1609)
at com.microsoft.aad.adal.AuthenticationContext.localFlow(AuthenticationContext.java:1261)
at com.microsoft.aad.adal.AuthenticationContext.acquireTokenAfterValidation(AuthenticationContext.java:1229)
at com.microsoft.aad.adal.AuthenticationContext.acquireTokenLocalCall(AuthenticationContext.java:1123)
at com.microsoft.aad.adal.AuthenticationContext.refreshToken(AuthenticationContext.java:1609)
at com.microsoft.aad.adal.AuthenticationContext.localFlow(AuthenticationContext.java:1261)
at com.microsoft.aad.adal.AuthenticationContext.acquireTokenAfterValidation(AuthenticationContext.java:1229)
at com.microsoft.aad.adal.AuthenticationContext.acquireTokenLocalCall(AuthenticationContext.java:1123)
at com.microsoft.aad.adal.AuthenticationContext.access$600(AuthenticationContext.java:58)
at com.microsoft.aad.adal.AuthenticationContext$4.call(AuthenticationContext.java:1072)
at com.microsoft.aad.adal.AuthenticationContext$4.call(AuthenticationContext.java:1067)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
我正在使用的 AzureAD 库版本:1.1.7(为了防止指责太旧的版本 - 我检查了从 1.1.7 到 1.1.11 的变更列表,但没有发现任何与问题相关的内容)
问题:现在,我正在处理这个错误,作为让用户进入登录屏幕的信号。在我看来,这会给用户带来糟糕的体验。事实上,它非常经常发生并影响许多用户,这使情况变得更糟。
问题:我是否可以做任何不同的事情来避免此 AuthenticationException
或以某种方式解决它(即避免用户再次输入凭据)。
最佳答案
您是否已验证 AuthenticationContext.acquireTokenSilentSync()
确实是您希望调用的方法?
文档表明此方法将明确不显示提示。来自文档:
This is sync function. It will first look at the cache and automatically checks for the token expiration. Additionally, if no suitable access token is found in the cache, but refresh token is available, the function will use the refresh token automatically. This method will not show UI for the user. If prompt is needed, the method will return an exception.
根据此 AAD book,您获得的刷新 token 应持续两周.刷新 token 过期后,用户需要重新进行身份验证。你能用 Fiddler 或 Charles 检查网络流量并检查 token 的到期时间吗?如果您可以验证 token 在到期前未能刷新,则可能表示 AD 库中存在错误。
澄清 AuthenticationContext
方法的区别 - 有两类方法:“静默”方法(在用户需要重新验证时不会向用户显示对话框),以及非沉默。如果需要用户重新验证(或同意),非静默方法将启动包含 AAD 登录的新 Activity 。此时身份验证流程将重新启动。
此外,如果您更改应用程序在 Azure 中的注册,例如添加新的权限范围,您的用户将需要重新同意应用程序继续处理他们的数据。
关于android - 适用于 Android 的 AzureAD 抛出 ADALError.AUTH_REFRESH_FAILED_PROMPT_NOT_ALLOWED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34614259/
我已在 Powershell 版本 7 中安装了 AzureAD 模块,但无法执行 Connect-AzureAD Cmdlet。 有什么想法吗? PS C:\Users\User> Get-Inst
我有一个 WebApplication(例如 https://test.com/webapp1 处的 WebApp1)。 WebApp1 要求用户使用 AzureAD 进行身份验证(TenantId:
我正在尝试在 ADO 中的 azure powershell 任务中执行 Get-AzureADServicePrincipal。我需要获取服务主体,然后连接以获取 ServicePrincipalI
我正在尝试在 ADO 中的 azure powershell 任务中执行 Get-AzureADServicePrincipal。我需要获取服务主体,然后连接以获取 ServicePrincipalI
我想使用 Azuread Provider 创建应用程序注册,并使用 applictionid 输出作为我的应用程序服务中的配置。每次我计划时,我都会收到一条错误消息。如果我删除配置行,一切正常。 我
我正在尝试 AzureAD 试用版,以便使用 Microsoft 产品提供的 API(我也注册了高级试用版)。 我已成功注册我的 iOS 应用程序,但每当我尝试添加权限时,它都会在“选择权限”处显示雨
我已经在门户中设置了我的 AzureAD,以及一个使用 AD 来验证以下 Microsoft 说明的应用程序服务。 我制作了一个使用此授权的 .net core 应用程序。它可以在我的本地主机上运行。
我已经在门户中设置了我的 AzureAD,以及一个使用 AD 来验证以下 Microsoft 说明的应用程序服务。 我制作了一个使用此授权的 .net core 应用程序。它可以在我的本地主机上运行。
我正在开发一个管道,用于从 Azure Active Directory 检索所有条件访问策略并创建 csv 列表 我的问题是,我发现一个命令 get-azureadmsconditionalacce
RestAPI:我有一个使用 AzureAd 身份验证运行 Asp Core 的 Rest API。 WebApp:我有一个单独的 Web 应用程序,运行 Asp Core 作为后端,并使用 Java
我正在尝试使此命令在我的 MAC 操作系统上运行,甚至安装我在其他博客中找到的所有模块,例如 AzureAD、AzureADPreview。我仍然收到同样的消息。有人可以给我一些有关修复的线索吗? C
尝试通过 powershell 将一些 Azure AD 组从静态更改为动态(有 75 个组,因此我们需要以某种方式执行此操作) 最初我试图使用此脚本从 TXT 中的列表自动运行它: $groupli
我们正在使用MS Graph API,想检查某个组中用户的变化。目前我们通过以下查询获取用户: https://graph.microsoft.com/v1.0/groups/group-id/mem
我正在运行脚本以将新用户添加到 Azure AD $AzureADConnection = Connect-AzureAD $AdminEmail = $AzureADConnection.Accou
我尝试使用命令 Connect-AzureAD 通过 PowerShell 连接到 AzureAD,但单点登录时出现空白页面。 但是,当我使用命令 Connect-MsolService 时,它就像一
我们在自己的服务器上有应与 SharePoint Online 一起使用的应用程序。要访问 SP Online,我们需要拥有应用 token / secret - 这很好。 我想知道是否有可能通过此
我有一些公司网站提供一些受 Azure AD 保护的信息。这在浏览器中工作得很好,但我想在命令行上创建一些自动化。 如果我从浏览器复制 JWT 并在 Authorization: Bearer hea
如何使用 powershell 设置服务主体的回复 URL。当我检查管理门户时,以下命令不会向该字段添加任何内容。 $aa = new-AzureADApplication -DisplayName“
我有 React 前端应用程序和 AWS lambda 后端。我已经使用 MSAL 将 AzureAD 身份验证集成到我的 React 应用程序中。我想澄清一些事情 用户登录前端后,我想调用我的后端
使用 AzureAD 模块,我可以使用 Get-AzureADServicePrincipalOAuth2PermissionGrant cmdlet 检索服务主体的所有委派权限。但是,我找不到类似的
我是一名优秀的程序员,十分优秀!