如何在AcquireTokenByAuthorizationCodeAsync之后处理MsalUiRequiredException

问题描述 投票:1回答:1

我们最近实施了一些条件访问策略,需要对某些应用程序进行多因素身份验证。其中一个策略强制CA在某些通过Graph公开的数据集上,因此特定的Graph范围现在需要多因素身份验证。

我正在努力使用MSAL v3预览库在.Net Web应用程序中处理这种情况。我的网络应用程序本身不属于CA策略,但它正在尝试请求图形范围。

配置身份验证时,我正在传递应用程序所需的所有图形范围:

app.UseOpenIdConnectAuthentication(
    new OpenIdConnectAuthenticationOptions
    {
        ClientId = ClientId,
        Authority = Authority,
        RedirectUri = RedirectUri,
        Scope = "openid profile offline_access " + GraphScopes,
        PostLogoutRedirectUri = postLogoutRedirectUri,

该身份验证流程不会强制用户使用MFA。下一步是AuthorizationCodeReceived事件。在那里,我正在创建一个令牌缓存并尝试通过授权代码获取令牌:

var code = context.Code;
string signedInUserId = context.AuthenticationTicket.Identity.FindFirst(ClaimTypes.NameIdentifier).Value;

TokenCache userTokenCache = new MSALSessionCache(signedInUserId, context.OwinContext.Environment["System.Web.HttpContextBase"] as HttpContextBase). GetMsalCacheInstance();

ConfidentialClientApplication cca = new ConfidentialClientApplication(ClientId, Authority, RedirectUri, new ClientCredential(AppKey), userTokenCache, null);
string[] scopes = GraphScopes.Split(new char[] { ' ' });
AuthenticationResult result = await cca.AcquireTokenByAuthorizationCodeAsync(code, scopes);

AcquireTokenByAuthorizationCodeAsync方法是抛出异常的方法 - MsalUiRequiredException。例外情况包括我假设需要以某种方式用于强制MFA的声明。

这就是我遇到障碍的地方。我如何处理这些索赔?我已经看到一些文档表明我应该在请求令牌时将它们用作extraQueryParameters,但我还没有找到一种允许我这样做的方法。我在ConfidentialClientApplicationBuilder类上找到了一个允许我指定声明的方法,但我仍然收到MsalUiRequiredException。

目前我的解决方案是将我的网络应用程序添加到原始的条件访问策略。这迫使MFA在auth流的前端并满足Graph。对我来说,这似乎是一个不必要的步骤。我应该能够在我的网络应用程序中处理错误并以编程方式强制执行MFA。

azure-active-directory msal
1个回答
1
投票

在MSAL GitHub中似乎有专门的page来解决这个问题。以下快照显示了文档中的相关部分。

enter image description here

基本上,我们需要的是在extraQueryParameters中指定所需声明的方法。在你的AuthorizationCodeReceived代表中,你可以使用ConfidentialClientApplication来达到预期的效果。特别是,GetAuthorizationRequestUrlAsyncConfidentialClientApplication方法允许使用额外查询参数中的所需声明为授权端点创建自定义URI。将用户重定向到上述端点将强制执行MFA并导致成功访问令牌生成。这是一个使用link方法在额外查询参数中指定自定义声明的GitHub示例的GetAuthorizationRequestUrlAsync

© www.soinside.com 2019 - 2024. All rights reserved.