未从 Azure B2C 目录的 MSAL 调用 OWIN 中间件通知

OWIN middleware notifications not being called from MSAL for Azure B2C directory

目前我正在努力解决这个问题...

我有一个在前端使用 MSAL 的 Azure B2C Angular SPA 应用程序。在后端,它是 ASP.NET 具有完整 .NET Framework 的 MVC。

我有一个应用程序在前端(SPA 应用程序)与 ADAL 完美配合,在后端(ASP.NET MVC)与 app.UseWindowsAzureActiveDirectoryBearerAuthentication 配合使用。

现在我正在使用 Azure B2C 并利用 MSAL.

我可以在前端使用 MSAL 登录,但在后端配置的中间件 ASP.NET MVC 不会触发。

app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
    // Generate the metadata address using the tenant and policy information
    MetadataAddress = String.Format(AadInstance, Tenant, DefaultPolicy),

    ResponseType = OpenIdConnectResponseType.CodeIdToken,

   // These are standard OpenID Connect parameters, with values pulled from web.config
    ClientId = ClientId,
    RedirectUri = RedirectUri,
    PostLogoutRedirectUri = RedirectUri,

    // Specify the callbacks for each type of notifications
    Notifications = new OpenIdConnectAuthenticationNotifications
    {
        RedirectToIdentityProvider = OnRedirectToIdentityProvider,
        AuthorizationCodeReceived = OnAuthorizationCodeReceived,
        AuthenticationFailed = OnAuthenticationFailed,
    },

    // Specify the claim type that specifies the Name property.
    TokenValidationParameters = new TokenValidationParameters
    {
        NameClaimType = "name"
    },

    // Specify the scope by appending all of the scopes requested into one string (separated by a blank space)
    Scope = $"openid profile offline_access user_impersonation"
}
);

在前端我调用:

msalService.loginPopup();

$rootScope.$on("msal:loginSuccess", function () {
    console.log("loginSuccess");

    var token = msalService.userInfo.idToken;
});

我收到 id token 并且登录成功...

我在 OWIN 中间件内的所有通知处理程序中放置了断点:

但是调试器永远不会停在那里,也就是说,中间件代码没有被调用。

为什么通知处理程序没有被触发?我是不是遗漏了什么或使用了错误的中间件?

最终我想要实现的是能够提取中间件中的 id_token 并做一些后端附加 logic\processing。添加自定义声明等。如前所述,我可以使用 ADALUseWindowsAzureActiveDirectoryBearerAuthentication 中间件来完成此操作。用户登录后,我就有机会连接到中间件的通知。

好吧...事实证明,我正在开发的这个应用程序与 front-end 中的 cookie 混淆,这导致与 MSAL 设置的令牌发生一些冲突。一旦我删除了 cookie 相关代码,OWIN 通知处理程序在发出 XHR 请求时被命中。

当我检查 Chrome 开发人员工具 并看到无效的 授权 header 正在发送。它的值为 [Object object]

但是我不得不更改 OWIN 中间件。现在是 app.UseOAuthBearerAuthentication:

app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions
{
    AccessTokenFormat = new JwtFormat(tvps, new OpenIdConnectCachingSecurityTokenProvider(string.Format(AadInstance, Tenant, DefaultPolicy))),

    Provider = new OAuthBearerAuthenticationProvider
    {
        OnValidateIdentity = async context =>
        {
            try
            {
                 .
                 .
                 .
            }
        }
    }
}

现在,每次请求到达 back-end 服务器时都会触发 OnValidateIdentity,我有机会检查声明或添加新声明。