我的目标是允许用户自由浏览 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);
实现这一目标的正确方法是什么?