Aspnet Core 3.1 Identity ConfirmEmail 未按预期工作

Posted

技术标签:

【中文标题】Aspnet Core 3.1 Identity ConfirmEmail 未按预期工作【英文标题】:Aspnet Core 3.1 Identity ConfirmEmail not working as expected 【发布时间】:2020-04-25 09:20:06 【问题描述】:

我正在使用 aspnet 核心托管的 blazor wasm 项目类型。我正在尝试通过发送给用户的电子邮件链接来确认用户帐户。

正在生成并发送电子邮件。生成的确认链接是: https://localhost:5001/accountconfirmation?code=CfDJ8L2gJclnoq5BioPxBNdLc8wCyaMHcitemYm7I8XKkey+M+vauvFOj0HN1meMs6JusAIMNd8gFCe/e8U0w3MMa0blmDzAMqrXGHvekYo5iPGeFlzLrY2guPO1iwAhUlQJ4t6ZRk5ieyGcgREID/9G8rwJKYC+Ct4WXtQiyfywGpixo63Y4B4hNdQquQE5trdzF0bOyeq2lJhbAlhe5TnsnGqiKbJq60oCuR07M/Gcp9URBLPYVCbG7Ymi+4BUUCRA/Q==&userId=5742c1f1-7957-4154-b12d-5e6e3eaebd0f

单击电子邮件链接时,用户将导航到 Blazor 前端 web 应用程序,然后该应用程序将查询字符串参数发布到 AccountsController 操作。在控制器操作中正确接收值。

我希望此操作方法可以将帐户设置为已确认,但事实并非如此。我也尝试了对代码进行 URL 编码,但仍然没有成功。userId 是一个 GUID,并作为字符串传递。

    [HttpGet]
    [Route(Urls.ConfirmAccount)]
    public async Task<IdentityResult> Confirm([FromQuery]string code,[FromQuery]string userId)
    
        var user = await _userManager.FindByIdAsync(userId);
        IdentityResult result = await _userManager.ConfirmEmailAsync(user, code);

        return result;
    

【问题讨论】:

你调试result了吗?它应该有更多的细节 【参考方案1】:

尝试添加 Base64UrlDecode

    [HttpGet]
    [Route(Urls.ConfirmAccount)]
    public async Task<IdentityResult> Confirm([FromQuery]string code,[FromQuery]string userId)
    
        code = Encoding.UTF8.GetString(WebEncoders.Base64UrlDecode(code));
        var user = await _userManager.FindByIdAsync(userId);
        IdentityResult result = await _userManager.ConfirmEmailAsync(user, code);

        return result;
    

这是来自一个工作示例:https://github.com/ADefWebserver/Blazor-Blogs/blob/master/BlazorBlogs/Areas/Identity/Pages/Account/ConfirmEmail.cshtml.cs

【讨论】:

嗨迈克尔,我添加了你的代码,但仍然失败:Microsoft.AspNetCore.Identity.SignInManager[0] => RequestPath:/api/login RequestId:0HLSKEIVKDL56:000000E7, SpanId:|e90a55c7-428f5fcd34ea0053。 , TraceId:e90a55c7-428f5fcd34ea0053, ParentId: => CommunityApp.Server.Controllers.LoginController.Login (CommunityApp.Server) 用户 7de630a5-51a0-4ad5-9f78-94d304df263c 在没有确认电子邮件的情况下无法登录。 我唯一能建议的就是拉下我的项目并运行它。也许我创建令牌的方式就是为什么它对我有用? 在这个页面上我调用 Base64UrlEncode github.com/ADefWebserver/Blazor-Blogs/blob/master/BlazorBlogs/… 嗨迈克尔 - 我使用了你的确切代码,它开始工作 - 再次感谢 所以这两段代码一起是: ENCODING : var code = await userManager.GenerateEmailConfirmationTokenAsync(user); code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));和解码:code = Encoding.UTF8.GetString(WebEncoders.Base64UrlDecode(code));

以上是关于Aspnet Core 3.1 Identity ConfirmEmail 未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

AspNet Core Identity,如何设置options.Cookie.SameSite?

AspNet Identity Core - 登录时的自定义声明

将 Microsoft.AspNet.Identity 升级到 rc1 后找不到 IdentityStoreManager

ASP.net如何得到SCOPE_IDENTITY()?

ASP.NET Core Identity 3.1:UserManager.RemoveFromRoleAsync 总是返回 UserNotInRole

我的 AspNet Core 3.1 身份页面在 IdentityServer4 中给出 404。我怎样才能访问这些?这是路线问题吗?