【发布时间】: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