.NET 8 SPA 身份

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

我尝试在.NET 8中使用SPA身份 - https://learn.microsoft.com/en-us/aspnet/core/security/authentication/identity-api-authorization?view=aspnetcore-8.0#test-registration

它工作正常,但我需要两件事:

  1. 更改电子邮件文本 - 框架发送一些标准文本,但我需要发送我自己的 html 模板
  2. 注册后我需要启动一些后台进程

我无法找到如何做到这一点...有什么建议或示例吗?

谢谢你

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

如果您想根据需要修改API端点,我建议您可以检查此源代码

您可以将其复制并粘贴到您的项目中并修改

MapIdentityApi
方法。

像这样:

public static IEndpointConventionBuilder MapIdentityApi<TUser>(this IEndpointRouteBuilder endpoints)

创建一个新的:

public static IEndpointConventionBuilder MapMyIdentityApi<TUser>(this IEndpointRouteBuilder endpoints)

在 MapMyIdentityApi 方法内,您可以在其中定义自定义逻辑。

例如:

更改电子邮件文本 - 框架发送一些标准文本,但我需要发送我自己的 html 模板

在这些源代码中,包含以下代码,您可以根据您的要求进行修改。

    async Task SendConfirmationEmailAsync(TUser user, UserManager<TUser> userManager, HttpContext context, string email, bool isChange = false)
    {
        if (confirmEmailEndpointName is null)
        {
            throw new NotSupportedException("No email confirmation endpoint was registered!");
        }

        var code = isChange
            ? await userManager.GenerateChangeEmailTokenAsync(user, email)
            : await userManager.GenerateEmailConfirmationTokenAsync(user);
        code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));

        var userId = await userManager.GetUserIdAsync(user);
        var routeValues = new RouteValueDictionary()
        {
            ["userId"] = userId,
            ["code"] = code,
        };

        if (isChange)
        {
            // This is validated by the /confirmEmail endpoint on change.
            routeValues.Add("changedEmail", email);
        }

        var confirmEmailUrl = linkGenerator.GetUriByName(context, confirmEmailEndpointName, routeValues)
            ?? throw new NotSupportedException($"Could not find endpoint named '{confirmEmailEndpointName}'.");

        await emailSender.SendConfirmationLinkAsync(user, email, HtmlEncoder.Default.Encode(confirmEmailUrl));
    }

    return new IdentityEndpointsConventionBuilder(routeGroup);
}

注册后我需要启动一些后台进程

MapIdentityApi方法内部,包含注册post api代码,您也可以根据自己的意见进行修改:

    // 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($"{nameof(MapIdentityApi)} 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();
    });
© www.soinside.com 2019 - 2024. All rights reserved.