Angular MSAL AD 401 在 Angular 应用程序中未经授权,但在 Postman 中 200 正常 - ASP.NET Core Web API

Posted

技术标签:

【中文标题】Angular MSAL AD 401 在 Angular 应用程序中未经授权,但在 Postman 中 200 正常 - ASP.NET Core Web API【英文标题】:Angular MSAL AD 401 Unauthorized in Angular App but 200 Ok in Postman - ASP.NET Core Web API 【发布时间】:2020-07-04 16:05:32 【问题描述】:

早安,

我正在尝试使用 Angular MSAL 从我的 ASP.NET Core Web API 获取数据,但我的 Angular 应用程序中出现错误,显示 401 Unauthorized Error。

我尝试在浏览器的应用程序选项卡中获取access_token 并在 Postman 上使用它,从技术上讲它可以工作。我只是不知道为什么它会在我的 Angular 应用程序中引发 Unauthorized 401 错误。

这是我的app.module.js

export const protectedResourceMap: [string, string[]][] = [
  ['https://graph.microsoft.com/v1.0/me', ['user.read']]
];

const isIE = window.navigator.userAgent.indexOf("MSIE ") > -1 || window.navigator.userAgent.indexOf("Trident/") > -1;

imports: [
// msal angular
     MsalModule.forRoot(
        auth: 
            clientId: 'MYCLIENTID-FROMAD',
            authority: "https://login.microsoftonline.com/common/",
            validateAuthority: true,
            redirectUri: "http://localhost:4200/",
            postLogoutRedirectUri: "http://localhost:4200/",
            navigateToLoginRequestUrl: true,
        ,
        cache: 
            cacheLocation : "localStorage",
            storeAuthStateInCookie: true, // set to true for IE 11
        ,
        framework: 
            unprotectedResources: ["https://www.microsoft.com/en-us/"],
            protectedResourceMap: new Map(protectedResourceMap)
        ,
      , 
        popUp: !isIE,
        extraQueryParameters: 
    )
],
providers: [
    
        provide: HTTP_INTERCEPTORS,
        useClass: MsalInterceptor,
        multi: true
      
   ],

这是我的 ASP.NET Core Web API 主机:http://localhost:5000

它在某些Controllers 中实现[Authorize]。我认为我的后端存在问题,因为当我使用授权标头为Bearer access_token 的 Postman 测试它时,一切都在使用本地存储中的 access_token 工作。

Browser Application Tab after successfully login

提前谢谢你。

【问题讨论】:

【参考方案1】:

在我看来,您缺少的主要内容是受保护的资源映射配置。 目前它只定义了 MS Graph API。 您也应该在那里添加自己的 API:

export const protectedResourceMap: [string, string[]][] = [
  ['https://graph.microsoft.com/v1.0/me', ['user.read']],
  ['http://localhost:5000', ['your-api-client-id/user_impersonation']]
];

your-api-client-id 替换为 API 的客户端 ID/应用程序 ID。 您还可以使用 API 的应用程序 ID URI。 最后一部分是范围, 将 user_impersonation 更改为您在 API 上定义的范围(可以通过在 Azure 门户中公开 API 来完成)。

现在,当它看到对 http://localhost:5000 的 HTTP 请求时,它会知道为它获取令牌并将其附加到请求中。

【讨论】:

我做了你的建议并配置了我的“公开 API”,但我收到了这个错误:ServerError: AADSTS65005: The application '_CLIENT_ID_HERE' ask for scope 'user_impersonation' 不存在。跟踪 ID:bf1c22ba-6ee1-4090-ae3a-a77292d58300 相关 ID:e6ad93a5-51d3-4076-a0fc-487072f2c97c 时间戳:2020-03-24 08:26:28Z 您是否在应用注册中使用该名称定义了范围? imgur.com/g4q1816 - 我的 Azure Portal Expose API 和我的浏览器应用程序已更改为 imgur.com/NU8X1XS 请看图片先生 感谢您的提示和帮助。我尝试使用不同的浏览器打开它,我可以登录 :)) 非常感谢! @juunas。上帝保佑 + 并在这次病毒大流行期间保持安全(您和您的家人)。

以上是关于Angular MSAL AD 401 在 Angular 应用程序中未经授权,但在 Postman 中 200 正常 - ASP.NET Core Web API的主要内容,如果未能解决你的问题,请参考以下文章

使用 Angular 8 中的 MSAL 库获取 Microsoft Azure AD 组名称列表

Azure AD for Angular + ASP.net web api - Msal Angular HTTP 拦截器不为 POST 方法附加令牌

使用 MSAL 保护 ASP.Net Core Web API 和 Angular App

登录后如何获取用户名?我正在尝试使用 MSAL(@azure/msal-angular)进行 Azure 登录

Electron + Vue + msal-nodejs + Azure Ad:重定向 URL 问题

不记名令牌未添加到 HTTP 请求 - MSAL2 Angular