- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试开发一个VueJS单页应用程序,该应用程序会将您登录到AAD,以便我可以获取访问 token 以调用各种API(例如Graph)。
用户登录后,您必须获取 token ,并且有两种方法可以这样做:静默方式(如果失败,则使用重定向体验)。
但是,我无法使用两种方法来获取 token :
export default class AuthService {
constructor() {
console.log('[AuthService.constructor] started constructor');
this.app = new Msal.PublicClientApplication(msalConfig);
this.signInType = 'loginRedirect';
}
init = async () => {
console.log('[AuthService.init] started init');
await this.app.handleRedirectPromise().catch(error => {
console.log(error);
});
try {
let signedInUser = this.app.getAllAccounts()[0];
// if no accounts, perform signin
if (signedInUser === undefined) {
alert(this.app.getAllAccounts().length == 0)
await this.signIn();
signedInUser = this.app.getAllAccounts()[0];
console.log("user has been forced to sign in")
}
console.log("Signed in user is: ", signedInUser);
// Acquire Graph token
try {
var graphToken = await this.app.acquireTokenSilent(authScopes.graphApi);
console.log("(Silent) Graph token is ", graphToken);
alert(graphToken);
} catch (error) {
alert("Error when using silent: " + error)
try {
var graphToken = await this.app.acquireTokenRedirect(authScopes.graphApi);
} catch (error) {
alert ("Error when using redirect is: " + error)
}
alert("(Redirect) Graph token is " + graphToken);
}
} catch (error) {
console.log('[AuthService.init] handleRedirectPromise error', error);
}
}
signIn = async () => {
console.log('[AuthService.signIn] signInType:', this.signInType);
this.app.loginRedirect("user.read", "https://xxx.azurewebsites.net/user_impersonation");
}
signOut = () => {
this.app.logout();
}
}
加载SPA后,我将重定向到AAD登录页面。
Error when using silent: ClientAuthError: no_account_in_silent_request: Please pass an account object, silent flow is not supported without account information
Error when using redirect is: BrowserAuthError: interaction_in_progress: Interaction is currently in progress. Please ensure that this interaction has been completed before calling an interactive API.
(Redirect) Graph token is undefined
acquireTokenSilent
仍未登录?
BrowserAuthError: interaction_in_progress
是什么意思?我在网上搜索了此内容,发现的唯一结果是因为有人使用了过时的msal-browser版本。就我而言,我使用的是最新版本和最新版本(v2.0.1)。
const silentRequest = {
account: signedInUser,
scopes: authScopes.graphApi.scopes1
}
var graphToken = await this.app.acquireTokenSilent(silentRequest);
好像我以错误的格式传递了我的范围(即应该传递一个数组,它实际上不是一个数组!)
acquireTokenSilent
的信息存在差异
acquireTokenSilent
方法。但是,
over here,我们也被告知在范围的旁边传递accountInfo。
acquireTokenRedirect
工作...
acquireTokenRedirect
运行正常。
import * as Msal from '@azure/msal-browser';
const msalConfig = {
auth: {
clientId: "XYZ",
authority: "ABC",
},
cache: {
cacheLocation: 'localStorage',
storeAuthStateInCookie: true
}
};
export default class AuthenticationService {
constructor() {
this.app = new Msal.PublicClientApplication(msalConfig)
}
init = async () => {
try {
let tokenResponse = await this.app.handleRedirectPromise();
let accountObj;
if (tokenResponse) {
accountObj = tokenResponse.account;
} else {
accountObj = this.app.getAllAccounts()[0];
}
if (accountObj && tokenResponse) {
console.log("[AuthService.init] Got valid accountObj and tokenResponse")
} else if (accountObj) {
console.log("[AuthService.init] User has logged in, but no tokens.");
try {
tokenResponse = await this.app.acquireTokenSilent({
account: this.app.getAllAccounts()[0],
scopes: ["user.read"]
})
} catch(err) {
await this.app.acquireTokenRedirect({scopes: ["user.read"]});
}
} else {
console.log("[AuthService.init] No accountObject or tokenResponse present. User must now login.");
await this.app.loginRedirect({scopes: ["user.read"]})
}
} catch (error) {
console.error("[AuthService.init] Failed to handleRedirectPromise()", error)
}
}
}
最佳答案
经过一些反复试验,但终于使acquireTokenRedirect
成功运行,这是节录,可以帮助其他人:
import * as Msal from '@azure/msal-browser';
const msalConfig = {
auth: {
clientId: "XYZ",
authority: "ABC",
},
cache: {
cacheLocation: 'localStorage',
storeAuthStateInCookie: true
}
};
export default class AuthenticationService {
constructor() {
this.app = new Msal.PublicClientApplication(msalConfig)
}
init = async () => {
try {
let tokenResponse = await this.app.handleRedirectPromise();
let accountObj;
if (tokenResponse) {
accountObj = tokenResponse.account;
} else {
accountObj = this.app.getAllAccounts()[0];
}
if (accountObj && tokenResponse) {
console.log("[AuthService.init] Got valid accountObj and tokenResponse")
} else if (accountObj) {
console.log("[AuthService.init] User has logged in, but no tokens.");
try {
tokenResponse = await this.app.acquireTokenSilent({
account: this.app.getAllAccounts()[0],
scopes: ["user.read"]
})
} catch(err) {
await this.app.acquireTokenRedirect({scopes: ["user.read"]});
}
} else {
console.log("[AuthService.init] No accountObject or tokenResponse present. User must now login.");
await this.app.loginRedirect({scopes: ["user.read"]})
}
} catch (error) {
console.error("[AuthService.init] Failed to handleRedirectPromise()", error)
}
}
}
关于adal - 无法使用msal-browser静默或通过重定向获取 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63347299/
我从 GitHub 下载了示例以试验 Azure AD B2C https://github.com/Azure-Samples/active-directory-b2c-dotnet-webapp-
为了在我的 JavaScript 代码中使用 MSAL 获取访问 token ,我拼凑了大量教程和文档。这是我的研究结果。 最佳答案 npm 安装@azure/msal 从@azure/msal 导入
我正在编写一个 Chrome 扩展程序,它需要访问需要 AAD 访问 token 的 ASP.NET Core Web API。我正在尝试使用 msal NPM 包提供身份验证流程,以便用户可以使用他
我没有从使用 MSAL 库的 UserAgentApplication 实例的 loginPopup(requestObj) 获得 loginResponse。 Azure 示例用作 https://
我对 OAuth2 以及 AccessToken 和 RefreshToken 的概念比较熟悉。 看起来 MSAL 在使用 ClientApplicationBase.AcquireTokenSile
我使用了 msal.js 文件(版本 1.0.3),但是没有调用 authCallback 函数, var clientApplication = new Msal.UserAgentApplicat
Dynamics 365 的门户功能提供了使用 Azure AD B2C 登录的功能。这是我对其控制能力有限的产品功能,据我所知,该功能是在没有 MSAL 的情况下实现的。 在门户上下文中,我尝试使用
我正在尝试遵循 Microsoft active-directory 的教程 将客户端 ID 和 key 输入代码并运行代码后,它会将我带到登录页面,我使用凭据登录,但出现以下错误: "errorCo
我正在尝试遵循 Microsoft active-directory 的教程 将客户端 ID 和 key 输入代码并运行代码后,它会将我带到登录页面,我使用凭据登录,但出现以下错误: "errorCo
我正在尝试使用 Azure MSAL 浏览器 js CDN 将对象初始化为 PublicClientApplication。但我发现 Msal 未定义。 CDN:https://alcdn.msaut
我尝试使用此处提供的代码:https://github.com/Azure-Samples/active-directory-javascript-singlepageapp-dotnet-webap
@azure/msal-browser 2.14.1@azure/msal-react 1.0.0-beta.2 我们正在使用自定义 B2C 政策 当我使用 PublicClientApplicati
我有一个使用 msal 0.1.2 的 angular7 应用程序。用户间歇性地无法访问任何需要身份验证的内容,当您查看开发人员工具网络选项卡时,您可以看到一个 GET 请求来获取 https://l
@azure/msal-browser 2.14.1@azure/msal-react 1.0.0-beta.2 我们正在使用自定义 B2C 政策 当我使用 PublicClientApplicati
我想使用应用程序 ID 和 secret 对 AAD 用户进行身份验证,以通过 MSAL 访问 powerBi 资源。所以我想获取访问 token 并将其缓存在 SQL Db 中。 经历了 docum
我尝试包含 Azure AD 进行登录,但在运行 npm install @azure/msal-browser @azure/msal-angular 以及 npm install @azure/m
我尝试包含 Azure AD 进行登录,但在运行 npm install @azure/msal-browser @azure/msal-angular 以及 npm install @azure/m
我想安装 @azure/msal-angular 以使用 Angular 作为前端来使用 azure B2C 身份验证,但是当我尝试安装该包时,它给了我一个错误 npm ERR! code E
我想安装 @azure/msal-angular 以使用 Angular 作为前端来使用 azure B2C 身份验证,但是当我尝试安装该包时,它给了我一个错误 npm ERR! code E
使用msal.js库(Microsoft身份验证库),可以通过哪种方法知道给定用户是否已经登录?我的意图是如果用户的凭据已经保存在浏览器的存储中,则避免显示登录弹出窗口 我目前的做法: functio
我是一名优秀的程序员,十分优秀!