-1

Identity Core を使用して電子メール確認トークンを生成する DotNet Core WebApi があります。トークンを生成し、WebApi URL を使用して自分のメール アドレスに送信すると、正常に動作します。Angular Web アプリで ur?token=token をメールに送信してアプリから AJAX 呼び出しを行うと、「無効なトークン」エラーが発生します。Angular Service からの 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.';
            }
          );

Angular サービス

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));

トークンを検証しようとしたさまざまな方法はすべて失敗しました。それらはすべて無効なトークンを持っています。コード比較を使用して、トークンが実際に異なるかどうかを確認してみましたが、それは最初の方法ではありません。トークンは一致しますが、無効なトークンが引き続き取得されます。

4

3 に答える 3

0

これは本当にばかげているように聞こえますが、次のことを行った後、何らかの理由で:

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

これで、電子メールの検証が機能します。

于 2021-01-20T03:39:11.087 に答える