具有 Microsoft Entra ID 身份验证的 Blazor 服务器应用程序

问题描述 投票:0回答:1

我在 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;
});
asp.net-core authentication azure-active-directory blazor-server-side
1个回答
0
投票

您应该使用中间件来获取用户信息,如下所示。

为什么

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();
});

© www.soinside.com 2019 - 2024. All rights reserved.