ASP.NET Web API 2 - 用户注册电子邮件确认失败

Posted

技术标签:

【中文标题】ASP.NET Web API 2 - 用户注册电子邮件确认失败【英文标题】:ASP.NET Web API 2 - User Registration Email Confirmation Fails 【发布时间】:2015-02-17 06:17:53 【问题描述】:

这是一个 Asp.Net WEB Api 项目。我正在尝试让用户注册到该站点并向用户发送电子邮件以在授予访问权限之前确认他们的电子邮件。我能够注册并生成用于电子邮件确认的令牌,但回调 url 生成失败。到目前为止,这是我的代码。

AccountController.cs

[AllowAnonymous]
[Route("Register")]
public async Task<IHttpActionResult> Register(UserModel userModel)

    if (!ModelState.IsValid)
        
            return BadRequest(ModelState);
        

    IdentityResult result = await authRepository.RegisterUser(userModel);
        IHttpActionResult errorResult = GetErrorResult(result);

    if (errorResult != null)
        
            return errorResult;
    


            return Ok();

AuthRepository.cs

public async Task<IdentityResult> RegisterUser(UserModel userModel)

    IdentityUser user = new IdentityUser
        
            UserName = userModel.UserName,
                Email = userModel.UserName
    ;

    IdentityResult result = await userManager.CreateAsync(user, userModel.Password); //var result

        if (result.Succeeded)
        
            try
                
                    var provider = new DpapiDataProtectionProvider("TestWebAPI");
                    userManager.UserTokenProvider = new DataProtectorTokenProvider<IdentityUser>(provider.Create("EmailConfirmation"));
                    var code = await userManager.GenerateEmailConfirmationTokenAsync(user.Id);
                    UrlHelper urlHelper = new UrlHelper();
                    var callbackUrl = urlHelper.Action
                        (
                            "ConfirmEmail", "Account",
                            new  userId = user.Id, code = code ,
                            protocol: "http"
                        );

                    await userManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm...." + "<a href=\"" + callbackUrl + "\">click here</a>");
        
                catch (Exception ex)
                
                    throw new Exception(ex.ToString());
                
    
        return result;

它在我生成回调 URL 时失败。我得到这个例外: "值不能为空。\r\n参数名称:routeCollection"

堆栈跟踪

at System.Web.Mvc.UrlHelper.GenerateUrl(String routeName, String actionName, String controllerName, RouteValueDictionary routeValues, RouteCollection routeCollection, RequestContext requestContext, Boolean includeImplicitMvcValues)
   at System.Web.Mvc.UrlHelper.GenerateUrl(String routeName, String actionName, String controllerName, String protocol, String hostName, String fragment, RouteValueDictionary routeValues, RouteCollection routeCollection, RequestContext requestContext, Boolean includeImplicitMvcValues)
   at System.Web.Mvc.UrlHelper.Action(String actionName, String controllerName, Object routeValues, String protocol)
   at TestWebAPI.AuthRepository.<RegisterUser>d__1.MoveNext() in d:\Workspace\VKalpa 2.0\Projects\Test\WebAPI-0.2\TestWebAPI\TestWebAPI\AuthRepository.cs:line 44

有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

终于搞定了。我阅读了文档并让它工作...... 这是我的代码,适用于在 Asp.Net Web API 上下文中发送电子邮件时遇到问题的人。在 MVC 5 Web 应用程序的上下文中处理类似问题的 SO 示例也很有帮助。

...
if (result.Succeeded)
            
                try
                
                    var provider = new DpapiDataProtectionProvider("TestWebAPI");
                    userManager.UserTokenProvider = new DataProtectorTokenProvider<IdentityUser>(provider.Create("EmailConfirmation"));
                    var code = await userManager.GenerateEmailConfirmationTokenAsync(user.Id);

                    var newRouteValues = new RouteValueDictionary(new  userId = user.Id, code = code);
                    newRouteValues.Add("httproute", true);
                    UrlHelper urlHelper = new System.Web.Mvc.UrlHelper(HttpContext.Current.Request.RequestContext, RouteTable.Routes);
                    string callbackUrl = urlHelper.Action(
                        "ConfirmEmail",
                        "Account",
                        newRouteValues,
                        HttpContext.Current.Request.Url.Scheme
                        );

                    string emailTitle = "Please confirm your account";
                    string emailBody = "<a href='>" + callbackUrl + "'Please click Here to confirm your email</a>";

                    await userManager.SendEmailAsync(user.Id, emailTitle, emailBody);
                
                catch (Exception)
                
                    throw;
                
            

【讨论】:

试过了,效果很好!我用System.Web.Mvc.UrlHelper 使用throw new Exception(ex.ToString()) 简直太残忍了。只需使用简单的throw 就不会破坏捕获异常的人的调试体验。 @RamIyer just throw; 是一种更简洁、更被接受的做法。 @ProfK:说得对。【参考方案2】:

要从 web api 上下文生成 mvc url,您可以使用 System.Web.Http.Routing.UrlHelperLink 方法。像这样:

Url.Link("Default", new Controller = "Account", Action = "Index");

因此,要从您的代码生成一个 url,您需要将 api 操作中的 UrlHelper 传递给 AuthRepository。虽然不确定这是一个很好的解决方案,但也许您可以从中构建。

【讨论】:

以上是关于ASP.NET Web API 2 - 用户注册电子邮件确认失败的主要内容,如果未能解决你的问题,请参考以下文章

使用 ASP.NET Web API 2.0 和 Ionic Cordova 应用程序启用社交登录

具有个人用户帐户身份验证的 ASP.NET MVC 5 WEB API

Asp.net Core 2.0 web api 基础框架 详解

ASP.NET Web API 身份验证

试图从asp.net web api self host中的请求中获取用户代理

ASP.NET Web API 如何对用户进行身份验证