【问题标题】:Email confirmation in Web APIWeb API 中的电子邮件确认
【发布时间】:2020-09-12 04:24:06
【问题描述】:

我有 Web API 应用程序,我想实现电子邮件确认。

现在我有一个采用address 的方法——客户端主机将在回调网址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;
}

然后在客户端将对 API 进行 POST 调用:

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 交互。

请求中传递主机地址可以吗?如果没有,如果有多个客户,我该怎么办?如果是一个客户端,我可以将其移至配置。

【问题讨论】:

    标签: c# rest asp.net-web-api asp.net-core-webapi


    【解决方案1】:

    是的,可以在请求中将主机作为参数传递。

    【讨论】:

      【解决方案2】:

      我想用户应该在您的场景中与特定主机/地址相关联。您可以将与用户关联的主机存储在 Db 中,并通过 RegisterAsync 方法获取。

      【讨论】:

      • 用户使用多个客户端的情况如何?
      • 如果是这种情况/场景,可以选择在请求中将主机作为参数传递。
      猜你喜欢
      • 2020-08-16
      • 1970-01-01
      • 2015-02-17
      • 2014-11-03
      • 2017-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多