ASP.NET Core Web API 中 ASP.NET Core Identity 方法的角色授权

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

我正在尝试学习 ASP.NET Core Web API 和 ASP.NET Core Identity。我已经看到 ASP.NET Core Identity 现在已通过 MapIdentityAPI 作为 .NET 8 的一部分集成到 Web API 中。

我正在尝试开发一个使用我的 API 的应用程序,但是我想将注册过程限制为仅具有特定角色的授权用户。这是为了只有应用程序的管理员用户才能注册新用户。

我不确定如何解决这个问题,因为 Identity 方法是通过实现 ASP.NET Core Identity 自动生成的,因此我无法在它们上添加 Authorize 属性来限制访问。对于我该如何解决这个问题有什么建议吗?

非常感谢

我已经尝试在 .NET 8 中使用 ASP.NET Core Web API 实现 ASP.NET Core Identity,通过使用 Swagger 测试已经成功,但是我无法找到方法,因此我可以在它们上添加授权属性。我正在使用 API,因为它将成为 .NET MAUI 前端应用程序的连接器。

asp.net-core-webapi asp.net-identity .net-8.0
1个回答
0
投票

如果你只是想为注册路由添加角色,我建议你可以尝试创建一个自定义的mapidentityapi方法。

它的源代码是this:

因此,您只需复制它们并创建和修改 MapIdentityApi 方法的寄存器,如下所示:

         // NOTE: We cannot inject UserManager<TUser> directly because the TUser generic parameter is currently unsupported by RDG.
        // https://github.com/dotnet/aspnetcore/issues/47338
        routeGroup.MapPost("/register", async Task<Results<Ok, ValidationProblem>>
            ([FromBody] RegisterRequest registration, HttpContext context, [FromServices] IServiceProvider sp) =>
        {
            var userManager = sp.GetRequiredService<UserManager<TUser>>();

            if (!userManager.SupportsUserEmail)
            {
                throw new NotSupportedException($"xxxx requires a user store with email support.");
            }

            var userStore = sp.GetRequiredService<IUserStore<TUser>>();
            var emailStore = (IUserEmailStore<TUser>)userStore;
            var email = registration.Email;

            if (string.IsNullOrEmpty(email) || !_emailAddressAttribute.IsValid(email))
            {
                return CreateValidationProblem(IdentityResult.Failed(userManager.ErrorDescriber.InvalidEmail(email)));
            }

            var user = new TUser();
            await userStore.SetUserNameAsync(user, email, CancellationToken.None);
            await emailStore.SetEmailAsync(user, email, CancellationToken.None);
            var result = await userManager.CreateAsync(user, registration.Password);

            if (!result.Succeeded)
            {
                return CreateValidationProblem(result);
            }

            await SendConfirmationEmailAsync(user, userManager, context, email);
            return TypedResults.Ok();
        }).RequireAuthorization("Admin");
© www.soinside.com 2019 - 2024. All rights reserved.