2

我的目标是允许用户自由浏览 Angular 11+ 站点,在导航时读取从 .NET Web API 调用的数据。只有希望发布数据或访问特定功能的用户才需要使用 AD B2C 身份服务进行注册和登录。相应地,后端应用服务中的控制器被适当地标记为 [Authorize] 或 [AllowAnonymous]。

该站点成功地支持登录用户的浏览和发布,复制了AzureAD 示例中的方法。

export function MSALInterceptorConfigFactory(): MsalInterceptorConfiguration {
  const protectedResourceMap = new Map<string, Array<string>>();
  protectedResourceMap.set(apiConfig.uri, apiConfig.scopes);
  return {
    interactionType: InteractionType.Redirect,
    protectedResourceMap
  };
}

然而,使用这种方法,Msal 的 httpInterceptor 显然会在每次数据库调用时触发,从而在所有端点上强制执行 B2C 注册/登录事件,从而挫败支持匿名浏览的努力。

MSAL v1 显然支持 unprotectedResource 数组,但对于 v2 已弃用。它显然也支持使用空模式,例如

const resourceMap: [string, string[]][] = [
  [`${apiBaseUrl}/health`, null],
  [`${apiBaseUrl}`, ['scope1', 'scope2']],
];

由于该 v1 对象具有不同的形状,我在 v2 中尝试过这种方式,但无济于事

  const protectedResourceMap = new Map<string, Array<string>>();
  protectedResourceMap.set(apiConfig.uri + '/myreadabledata', []);
  protectedResourceMap.set(apiConfig.uri, apiConfig.scopes);

我尝试了其他方法,例如专门为需要授权的控制器设置 protectedResourceMap。那也失败了。

  const protectedResourceMap = new Map<string, Array<string>>();
  protectedResourceMap.set(apiConfig.uri  + '/mycloseddata1' , apiConfig.scopes);
  protectedResourceMap.set(apiConfig.uri  + '/mycloseddata2' , apiConfig.scopes);

实现这一目标的正确方法是什么?

4

1 回答 1

0

我遇到了同样的问题,希望一些 api 路由是匿名的,而不是触发重定向登录。设法遇到这个链接

看起来你真的很接近你的尝试。翻译我所做的我相信您可以使用以下内容

const protectedResourceMap = new Map<string, Array<string>>();
protectedResourceMap.set(apiConfig.uri + '/myreadabledata/*', null);
protectedResourceMap.set(apiConfig.uri, apiConfig.scopes);

从阅读代码来看,诀窍似乎是将不受保护的路径放在首位,并让它返回null.

我正在跑步2.0.0-beta.5,打电话时这对我有用GET uri/myreadabledata/{id}

于 2021-06-26T16:23:48.913 回答