【发布时间】:2021-01-11 18:49:45
【问题描述】:
我有一个 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));
我尝试验证令牌的所有不同方法都失败了。他们都有一个无效的令牌。我尝试使用代码比较来检查令牌是否确实不同,并且不适用于第一种方法。令牌匹配,我仍然得到一个无效的令牌。
【问题讨论】:
-
在将代码从服务器发送到 Angular 之前,使用 HttpUtility.UrlEncode(token) 对其进行编码。当令牌从 Angular 发送到您的服务器时,无需对其进行解码
-
我也已经尝试过了。第一次尝试修复令牌 var fix = token.Replace(' ', '+');给我一个相同的令牌,但我仍然得到“无效令牌”。
-
需要信息,令牌从 webApi 发送到邮件,从邮件发送到您的客户端应用程序。在客户端应用程序中,令牌非常好。但是,一旦您使用相同的令牌调用 AJAX 调用,您能否在接收 webApi 方法时验证令牌。如果相同,您可以尝试直接从客户端直接进行验证,只是为了知道哪个确切的 url 转换导致了问题。 _。 .而且我希望你没有为令牌做任何额外的自定义编码以获得更好的安全性(除了 URLEncode)
-
我没有做任何花哨的事情,我在 Angular 应用程序中尝试了 token=${encodeURIComponent(token)}。令牌之间的某个地方正在更改并且无法正常工作。如果我从 WebApi 发送带有返回 URL 的电子邮件到 API 端点,它工作正常。但从 Angular 来看,它没有。它让我发疯。
标签: angular .net-core token identityserver4 email-confirmation