亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Asp.net 核心電子郵件確認有時會顯示 InvalidToken

Asp.net 核心電子郵件確認有時會顯示 InvalidToken

C#
呼啦一陣風 2022-08-20 17:36:48
我正在使用 asp.net 核心身份2.1,并且我遇到了電子郵件確認的隨機問題,雖然電子郵件確認有時會顯示結果。錯誤 = 無效標記。令牌也不會過期。注意:我們正在使用多個服務器,并且我們還將密鑰存儲在一個位置,以便所有服務器都使用相同的密鑰。用于電子郵件確認的代碼段。電子郵件確認var confCode = await _userManager.GenerateEmailConfirmationTokenAsync(user);        var callbackUrl = Url.Action("ConfirmEmail", "Account", new        {            userId = user.Id,            code = WebUtility.UrlEncode(confCode)        }, protocol: HttpContext.Request.Scheme);        string confirmationEmailBody = string.Format(GetTranslatedResourceString("ConfirmationEmailBody"), "<a href='" + callbackUrl + "'>") + "</a>";令牌驗證public async Task<bool> ConfirmEmailAsync(string userId, string code)    {        if (string.IsNullOrEmpty(userId) || string.IsNullOrEmpty(code))            return false;        var user = await _userManager.FindByIdAsync(userId);        if (user == null)            return false;        var result = await _userManager.ConfirmEmailAsync(user, code).ConfigureAwait(false);        if (!result.Succeeded)            result = await _userManager.ConfirmEmailAsync(user, WebUtility.UrlDecode(code)).ConfigureAwait(false);        return result.Succeeded;    }無效的令牌下面的令牌被編碼兩次,但我們處理這種情況CfDJ8HYrrpCgcr5GvrItPOWapXRy8WF8odd%252BVKuDup7buRsl1x4agRpfgQlEIPWiBqM0Wuilu9tCv5l%252B3lNaAb89%252Fi%252B4k0y%252FH0jdXAbabz0%252FXDGA0eUrmcKdIsDFNuXeyP5ezTVmTx8t0ky9xCTXaKLAfvTsCJviETk5Ag9JbUs3l3%252BnUon6fyYOHsslJI5VKLqhMM0Sm%252BW1EE%252B%252FPEJ%252BXcn%252FPS1My%252BI1lExuF1R1hFEZScEsUCG%252Bx%252BVIFB9bzs1IoLC%252Baw%253D%253D任何幫助將不勝感激,謝謝!
查看完整描述

5 回答

?
達令說

TA貢獻1821條經驗 獲得超6個贊

此問題似乎是與基本查詢字符串相關的問題。您的問題中沒有關于樣本期望值和樣本實際值的指針。因此,我無法在這里為您提供確切的答案。但下面兩個是指針,它們肯定會解決這個問題。

可能存在兩個問題:

問題 1:在 HtmlDecode/UrlDecode 之后,原始 Base-64 無法恢復

這些令牌被編碼為 base 64 字符串,其中可能包含“+”等字符。

它們被發送到服務器。

然后服務器嘗試對此字符串執行 HtmlDecode 操作,以刪除原始 base 64 令牌中實際存在的字符。

例如,“+”被空字符串取代。

因此,在 WebUtility.HtmlDecode 之后生成的令牌無效。這就是您收到無效令牌錯誤的原因

How to check this ?您可以進行調試,并查看 HtmlDecode 后面的值和預期值。如果它們不同,那么這就是根本原因。

問題 2:查詢字符串格式不正確

查詢字符串中的多個鍵值對使用“&”字符連接。例如,key1=value1&key2=value2

但有時,它的編碼版本不是在查詢字符串中出現的。
例如,key1=value1&key2=value2&&amp;

如果是這種情況,.Net 服務器將無法正確分析查詢字符串。

How to check this ?您可以使用從 HttpContext 直接讀取原始查詢字符串,也可以使用 QueryString 屬性的 HttpRequest,并檢查是否屬于這種情況。如果是這樣,那么您可以更改客戶端以發送適當的查詢字符串(更具邏輯性和可維護性),或者編寫一些代碼以在服務器端進行更正。

這些指針應該可以幫助您解決問題。


查看完整回答
反對 回復 2022-08-20
?
梵蒂岡之花

TA貢獻1900條經驗 獲得超5個贊

您對電子郵件配置的請求將為您提供 userId 和您的私鑰的響應,但您的令牌方法應該是不同的函數,如令牌刷新,您需要添加一些條件,例如如果令牌已過期,則刷新令牌


查看完整回答
反對 回復 2022-08-20
?
哈士奇WWW

TA貢獻1799條經驗 獲得超6個贊

如果編碼的代碼末尾包含“==”。即在urlencode或base64編碼之后,如果代碼像這樣出現“cm9vdA==”。

對此進行解碼不會為您提供確切的編碼字符串,并將導致無效代碼。

因此,在生成令牌時,請檢查編碼值是否以“==”結尾。如果它確實生成了另一個令牌,則問題將得到解決。


查看完整回答
反對 回復 2022-08-20
?
智慧大石

TA貢獻1946條經驗 獲得超3個贊

您不需要使用標識服務器來解決此問題。

當用戶注冊時,請在用戶表中添加兩列。一個用于驗證,另一個用于 IsVerified。在驗證令牌列中添加一個 Guid。然后使用此 Guid 生成鏈接。當用戶單擊此鏈接時,您將在控制器中獲取 Guid。然后使用此列獲取此用戶,然后將“已驗證”列設置為 true 并刪除 Guid 列。您的用戶現在已成功驗證。


查看完整回答
反對 回復 2022-08-20
?
慕運維8079593

TA貢獻1876條經驗 獲得超5個贊

在將確認代碼傳遞到方法中之前,應對其進行解碼。_userManager.ConfirmEmailAsync(user, code).ConfigureAwait(false)

您已經對您在 callBackUrl 中使用的確認代碼進行了 URL 編碼;您應該在嘗試使用它之前對其進行解碼。WebUtility.UrlDecode(code)


查看完整回答
反對 回復 2022-08-20
  • 5 回答
  • 0 關注
  • 411 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號