2

我正在从 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 范围。

4

1 回答 1

3

AAD 访问令牌仅对一个 API 有效,因此请确保在请求令牌时仅指定 API 的范围。然后,AAD 将为您的应用提供 API 令牌。在身份验证请求中为多个 API 指定范围应该是可以的,但是当您请求令牌时,请仅指定一个 API 的范围。

在范围数组中,您有 user.read 用于 MS Graph API。

于 2020-04-02T06:23:35.423 回答