3

我们最近实施了一些条件访问策略,这些策略需要对某些应用程序进行多因素身份验证。其中一项策略强制 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。

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

4

1 回答 1

2

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

在此处输入图像描述

本质上,我们需要的只是一种在 extraQueryParameters 中指定所需声明的方法。在您的委托中AuthorizationCodeReceived,您可以使用ConfidentialClientApplication来实现所需的结果。特别是,GetAuthorizationRequestUrlAsync方法ConfidentialClientApplication允许使用额外查询参数中的所需声明创建自定义 URI 到授权端点。将用户重定向到上述端点将强制执行 MFA 并导致成功生成访问令牌。这是一个GitHub 示例的链接,该示例使用GetAuthorizationRequestUrlAsync方法在额外的查询参数中指定自定义声明。

于 2019-03-16T05:02:09.947 回答