微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Idenity.Core GenerateEmailConfirmationTokenAsync 来自 Angular 10 WebApp 的无效令牌

如何解决Idenity.Core GenerateEmailConfirmationTokenAsync 来自 Angular 10 WebApp 的无效令牌

我有一个 DotNet Core WebApi,它使用 Identity Core 生成电子邮件确认令牌。当我生成令牌并使用 WebApi URL 将其发送到我的电子邮件地址时,它工作正常。当我使用 Angular Web 应用程序将 ur?token=token 发送到我的电子邮件以从应用程序进行 AJAX 调用时,我收到“无效令牌”错误。来自 Angular 服务的 GET 调用获取 QueryString 并对 API 进行 AJAX 调用 ->“无效令牌”。

WebApi 代码

//I tried 
//var confirmationLink = Url.Content($"{this.Request.Scheme}://{siteUrl}{this.Request.PathBase}/Confirm?token={token}&email={appUser.Email}");
// And
var confirmationLink = Url.Content($"{this.Request.Scheme}://{siteUrl}{this.Request.PathBase}/Confirm?token={HttpUtility.UrlEncode(token)}&email={appUser.Email}");
SendEmail($"{model.FirstName} {model.LastName}","Confirm your account",model.Email,$"Please confirm your account by clicking {callback}");

角度视图

this.route.queryParams.subscribe(params => {
      this.email = params[emailKey];
      this.token = params[tokenKey];
    }); 

this.authenticationService.confirmEmail(this.email,this.token).subscribe(
            (result) => {
              this.emailMsg = 'Thank you for confirming your email. Please procced to login page.';
            },(err) => {
              this.emailMsg = 'Email confirmation link has expired or is invalid.';
            }
          );

角度服务

return this.http.get<boolean>(`${environment.apiUrl}/authenticate/VerifyEmail?email=${email}&token=${token}`)
      .pipe(
        map((data: boolean) => {
          return data;
        }),catchError((error: HttpErrorResponse) => {
          return throwError(error);
        })
      );

在电子邮件确认端点中,我尝试了一些不同的方法,但均无效。

var user = await _userManager.FindByEmailAsync(email);

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

var fix = token.Replace(' ','+');
var emailConfirmationResultescapefix = await _userManager.ConfirmEmailAsync(user,Uri.EscapeDataString(fix));

var emailConfirmationResulttest = await _userManager.ConfirmEmailAsync(user,Uri.EscapeDataString(token));

var code = HttpUtility.UrlDecode(token);
var emailConfirmationResult = await _userManager.ConfirmEmailAsync(user,Uri.EscapeDataString(code));

var urisescape = Uri.EscapeDataString(token);
var emailConfirmationResultescape = await _userManager.ConfirmEmailAsync(user,Uri.EscapeDataString(urisescape));

var webUtil = WebUtility.UrlDecode(token);
var emailConfirmationResultweb = await _userManager.ConfirmEmailAsync(user,Uri.EscapeDataString(webUtil));

我尝试验证令牌的所有不同方法都失败了。他们都有一个无效的令牌。我尝试使用代码比较来检查令牌是否确实不同,并且不适用于第一种方法。令牌匹配,但我仍然收到无效令牌。

解决方法

根据我的理解,您仅在 WebApi 中对令牌进行编码,但我建议在从 Angular 服务传递令牌时使用 encodeURIComponent() 对其进行编码。所以你的代码应该如下所示。

角度服务:

return this.http.get<boolean>(`${environment.apiUrl}/authenticate/VerifyEmail?email=${email}&token=${encodeURIComponent(token)}`)
      .pipe(
        map((data: boolean) => {
          return data;
        }),catchError((error: HttpErrorResponse) => {
          return throwError(error);
        })
      );
,

这听起来很愚蠢,但在执行以下操作后出于某种原因:

token = token.Replace(' ','+');

现在电子邮件验证有效。

,

不保证由 ASP.NET Identity 生成的令牌是 URL 安全的。

如果您使用 Identity.UI 包,那么它会为您处理自 3.x 版以来的 URL 安全。

我通常在代码中执行 Base64UrlEncoder.Encode(token)Base64UrlEncoder.Decode(token) 来解决此问题。它消除了所有可能导致 URL-s 问题的符号。

Base64UrlEncoder 来自命名空间 Microsoft.IdentityModel.Tokens

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?