【问题标题】:MsalUiRequiredException when Microsoft Graph used inside ClaimsTransformation在 ClaimsTransformation 中使用 Microsoft Graph 时出现 MsalUiRequiredException
【发布时间】:2021-10-28 14:54:38
【问题描述】:

我正在创建一个 ASP.NET Core 5 MVC 项目,并且我正在与 Microsoft 一起使用 Openid-Connect 以允许我们组织中的用户登录此 Web 服务。

这一切都很好,用户可以使用他们的 microsoft 工作帐户进行身份验证并登录。现在我想将他们的个人资料图片添加到声明中。

但是,我似乎无法让我的 IClaimsTransformation 工作。我已经制作了 UserPhotoClaims 来尝试为登录用户添加个人资料图片。如果我使用相同的图形代码在控制器中获取图片,那么它可以正常工作。

如果我在 ClaimsTransformation 中执行此操作,则会失败并显示以下消息:

MsalUiRequiredException:没有帐户或登录提示传递给 AcquireTokenSilent 调用。

Microsoft.Identity.Client.Internal.Requests.Silent.SilentRequest.ExecuteAsync(CancellationToken cancelToken)

MicrosoftIdentityWebChallengeUserException:IDW10502:由于用户质询而引发了 MsalUiRequiredException。见https://aka.ms/ms-id-web/ca_incremental-consent

Microsoft.Identity.Web.TokenAcquisition.GetAuthenticationResultForUserAsync(IEnumerable scopes, string authenticationScheme, string tenantId, string userFlow, ClaimsPrincipal user, TokenAcquisitionOptions tokenAcquisitionOptions)

我的 ClaimsTransformation 如下所示:

public class UserPhotoClaims : IClaimsTransformation
{
    private readonly GraphServiceClient _graph;

    public UserPhotoClaims(GraphServiceClient graphServiceClient)
    {
        _graph = graphServiceClient;
    }

    public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
    {
        if(!principal.HasClaim(x => x.Type == "photo"))
        {
            ClaimsIdentity id = new ClaimsIdentity();

            Stream photo = await _graph.Me.Photo.Content.Request().GetAsync();
            string ps = Convert.ToBase64String((photo as MemoryStream).ToArray());

            id.AddClaim(new Claim("photo", ps));
            principal.AddIdentity(id);
        }

        return principal;
    }
}

我已经在 startup.cs 的 ConfigureServices 中添加了转换:

services.AddTransient<IClaimsTransformation, UserPhotoClaims>();

非常感谢任何帮助!

【问题讨论】:

    标签: c# asp.net-core azure-active-directory


    【解决方案1】:

    这个问题可能是由于权限没有被同意,因为他们已经完成并且没有再次调用令牌缓存。

    可能的解决方法:

    1. 请检查门户中的权限是否获得同意,并在代码和门户中添加其他范围并同意后重试。
    2. 清除 cookie,退出并重试。
    3. 尝试通过将[AuthorizeForScopes(Scopes = new[] { "&lt;TheScopeThatYouArePassingOnAcquireTokenMethod&gt;" })] 添加到控制器中的操作。它处理 MSAL.NET MsalUiRequiredException 以处理条件访问和增量同意。 详情请查看this
    4. 您可以尝试使用 try-catch 处理异常>参见this
    5. 在公共客户端应用程序中,MSAL.NET 的设计使得 AcquireTokenInteractive 从不查看缓存。您可能需要先调用 AcquireTokenSilent

     try
        {
         result = await app.AcquireTokenSilent(scopes, accounts.FirstOrDefault())
                .ExecuteAsync();
        }
        catch (MsalUiRequiredException ex)
        {
    6.请查看transforming claims in ASP.NET Core | Microsoft Docs 并比较代码。

    请查看this教程,可以详细指导

    参考资料:

    1. msal-net-acquire-token-silently | Microsoft docs
    2. msal-error-handling | Microsoft docs
    3. get-microsoft-account-profile-photo-after-login | SO reference

    如果变通办法不能解决问题,您可以提出支持票。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      相关资源
      最近更新 更多