我在 Microsoft Entra ID 中注册了 Blazor Server 应用程序,我也想获取登录的用户数据和一些其他用户数据。 我是这样注册这个应用程序的:
如何从 Azure 获取这些用户信息(姓名、uid、电子邮件地址等)? 该解决方案适合我,但我想将其用作 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”类型上的属性“User”提供值。没有类型为“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();
});