未从 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 中间件内的所有通知处理程序中放置了断点:
- OnRedirectToIdentityProvider
- OnAuthorizationCodeReceived
- OnAuthenticationFailed
但是调试器永远不会停在那里,也就是说,中间件代码没有被调用。
为什么通知处理程序没有被触发?我是不是遗漏了什么或使用了错误的中间件?
最终我想要实现的是能够提取中间件中的 id_token 并做一些后端附加 logic\processing。添加自定义声明等。如前所述,我可以使用 ADAL
和 UseWindowsAzureActiveDirectoryBearerAuthentication
中间件来完成此操作。用户登录后,我就有机会连接到中间件的通知。
好吧...事实证明,我正在开发的这个应用程序与 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
,我有机会检查声明或添加新声明。
目前我正在努力解决这个问题...
我有一个在前端使用 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 中间件内的所有通知处理程序中放置了断点:
- OnRedirectToIdentityProvider
- OnAuthorizationCodeReceived
- OnAuthenticationFailed
但是调试器永远不会停在那里,也就是说,中间件代码没有被调用。
为什么通知处理程序没有被触发?我是不是遗漏了什么或使用了错误的中间件?
最终我想要实现的是能够提取中间件中的 id_token 并做一些后端附加 logic\processing。添加自定义声明等。如前所述,我可以使用 ADAL
和 UseWindowsAzureActiveDirectoryBearerAuthentication
中间件来完成此操作。用户登录后,我就有机会连接到中间件的通知。
好吧...事实证明,我正在开发的这个应用程序与 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
,我有机会检查声明或添加新声明。