Web API中的电子邮件确认

4

我有一个Web API应用程序,希望实现电子邮件确认。

现在我有一个方法,接受address参数--客户端主机的地址,它将出现在回调URL的uriBuilder中,并将由用户从邮件中打开:

public async Task<IdentityResult> RegisterAsync(string email, string userName, string password, string address)
{
    var user = new ApplicationUser { Email = email, UserName = userName };
    var result = await _userManager.CreateAsync(user, password);

    if (result.Succeeded)
    {
        var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);

        var uriBuilder = new UriBuilder(address) { Port = -1 };
        var query = HttpUtility.ParseQueryString(uriBuilder.Query);
        query["userId"] = user.Id;
        query["code"] = code;
        uriBuilder.Query = query.ToString();

        await _emailService.SendEmailAsync
        (
            user.Email,
            "Email confirmation",
            $"Confirm the registration by clicking on the <a href='{uriBuilder}'>link</a>."
        );
    }

    return result;
}

然后客户端将进行 POST 调用 API:
public async Task<bool> ConfirmEmailAsync(string userId, string code)
{
    var user = await _userManager.FindByIdAsync(userId);

    if (user == null)
    {
        throw new UserNotFoundException();
    }

    var result = await _userManager.ConfirmEmailAsync(user, code);
    return result.Succeeded;
}

这是为了让用户不直接与API交互。

在请求中传递主机地址是否可以?如果不能,那么如果有多个客户端应该怎么办?如果只有一个客户端,我可以将其移动到配置文件中。

2个回答

0

我想在您的情况下,用户应该与特定的主机/地址相关联。您可以将与用户关联的主机存储在数据库中,并在RegisterAsync方法中获取它。


当用户使用多个客户端时怎么办? - Hedgehog
如果是这种情况,可以选择将主机作为请求参数传递。 - Alexandre F. Malavasi Cardoso

0

没问题,在请求中将主机作为参数传递是可行的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接