У меня есть серверное приложение Blazor, зарегистрированное в Microsoft Entra ID, и я хочу получить данные пользователя, вошедшего в систему, а также данные некоторых других пользователей. Я зарегистрировал это приложение следующим образом:
Как я могу получить эту информацию о пользователе (имя, uid, адрес электронной почты и т. д.) из Azure? Это решение работает для меня, но я хотел бы использовать его как сервис для каждого запроса в Program.cs:
[CascadingParameter]
private Task<AuthenticationState>? authenticationState { get; set; }
protected override async Task OnInitializedAsync()
{
if (authenticationState is not null)
{
var authState = await authenticationState;
var user = authState?.User;
if (user?.Identity is not null && user.Identity.IsAuthenticated)
{
authMessage = $"{user.Identity.Name} is authenticated.";
var claims = user.Claims;
//These are just examples
var uid = claims.Where(x => x.Type.Equals("uid")).FirstOrDefault().Value;
var name = claims.Where(x => x.Type.Equals("name")).FirstOrDefault().Value;
}
}
}
ОБНОВЛЯТЬ Я попробовал это, но выдает ошибку:
InvalidOperationException: невозможно указать значение свойства «Пользователь» для типа «BlazorServerAppAzureAD.Pages.Index». Не существует зарегистрированной службы типа BlazorServerAppAzureAD.Data.IUser.
builder.Services.AddScoped<IUser, User>(st =>
{
var authState = st.GetService<AuthenticationState>();
var user = authState?.User;
if (user?.Identity is not null && user.Identity.IsAuthenticated)
{
var claims = user.Claims;
var uid = claims.Where(x => x.Type.Equals("uid")).FirstOrDefault().Value;
var name = claims.Where(x => x.Type.Equals("name")).FirstOrDefault().Value;
var email = claims.Where(x => x.Type.Equals("preferred_username")).FirstOrDefault().Value;
return new User { Id = new Guid(uid), Name = name, UserName = user.Identity.Name, Email = email };
}
return null;
});





Вам следует использовать промежуточное программное обеспечение для получения информации о пользователе, как показано ниже.
Почему
builder.Services.xxx используется для регистрации сервиса. Код после var app = builder. Build(); является промежуточным программным обеспечением, и каждый поступающий HTTP-запрос выполняется последовательно.
app.Use(async (context, next) =>
{
var user = context.User;
if (user.Identity.IsAuthenticated)
{
//var uid = user.Claims.FirstOrDefault(c => c.Type.Equals("uid"))?.Value;
var name = user.Claims.FirstOrDefault(c => c.Type.Equals("name"))?.Value;
var email = user.Claims.FirstOrDefault(c => c.Type.Equals("preferred_username"))?.Value;
//context.Response.Headers.Add("X-User-UID", new Microsoft.Extensions.Primitives.StringValues(uid));
}
await next();
});