我正在从 react SPA web 应用程序调用受保护的 web api。spa 和 web api 都已在 AzureAD 中注册,并通过“公开 API”和“API 权限”相互注册。
在客户端通过身份验证之后,在调用 Web api 之前,调用 (await this.props.provider.getAccessToken()) 以获取访问令牌。身份验证提供程序配置为:
export const authProvider = new MsalAuthProvider(
{
auth: {
authority: "https://login.microsoftonline.com/common",
clientId: "xxxx-xxxx-xxxxx",
postLogoutRedirectUri: window.location.origin,
redirectUri: window.location.origin,
validateAuthority: true,
navigateToLoginRequestUrl: false
},
system: {
logger: logger as any
},
cache: {
cacheLocation: "sessionStorage",
storeAuthStateInCookie: false
}
},
{
scopes: ["openid", "user.read", "api://xxxx-xxxxx-xxxxx/user_impersonation"]
},
{
loginType: LoginType.Redirect,
tokenRefreshUri: window.location.origin + "/auth.html"
}
);
其中“api://xxxx-xxxxx-xxxxx/user_impersonation”是 web api 范围请求。针对 web api 的授权失败并出现 401,因为在检查时返回的访问令牌缺少声明中的 web api 范围。