web-dev-qa-db-ja.com

確認メールのaspnetID無効トークン

アカウントを確認しようとしていますが、「無効なトークン」を取得しています。エラー。

これが私が試していることです:

_var code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
var callbackUrl = Url.Action("ConfirmacaoEmail", "Usuario", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);

await UserManager.SendEmailAsync(user.Id, "Ativação de Conta", user.GetEmailAtivacao(model.Nome, callbackUrl));
_

このコードの後に​​_UserManager.ConfirmEmailAsync_を呼び出すと、アカウントを確認できます。ただし、変数callbackUrl内にあるリンクを開いて、そのアクションで確認しようとすると、エラーが発生します。

OwinContextに問題があるのではないかと思ったので、HttpContext.GetOwinContext().GetUserManager<MyCustomUserService>を呼び出すことにしましたが、同じエラーが発生します。

手がかりはありますか?

15
Thiago Custodio

転送中のコードがブラウザによって変更されている可能性があります。トークンでUrlEncodeを実行してみてください。

var code = await userManager.GenerateEmailConfirmationTokenAsync(userId);
code = System.Web.HttpUtility.UrlEncode(code);

それ以外の場合、ブラウザはトークンに存在する可能性のある特別な記号をいじります。

24
trailmax

同じ問題が発生しました。次のコードで問題を解決しました。

サンプル:

var emailToken = _customManager.GenerateEmailConfirmationToken(userId);
emailToken = emailToken.Base64ForUrlEncode();

拡張メソッド=>名前空間:System.Text、System.Web

public static class UrlEncoding
{
        public static string Base64ForUrlEncode(this string str)
        {
            byte[] encbuff = Encoding.UTF8.GetBytes(str);
            return HttpServerUtility.UrlTokenEncode(encbuff);
        }

        public static string Base64ForUrlDecode(this string str)
        {
            byte[] decbuff = HttpServerUtility.UrlTokenDecode(str);
            return Encoding.UTF8.GetString(decbuff);
        }
}
22

わかりました、これは私の人生の無駄な時間-いや、日-です。このスレッドで他のすべての提案を試した後、 Asp.NET-ID 2-無効なトークンエラー 呼び出す代わりにそれを見つけました

await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);

generateEmailConfirmationTokenAsyncブロックの直前のRegisterメソッド内

await SignInAsync(user, isPersistent: false);

と定義されていると呼ばれました

private async Task SignInAsync(ApplicationUser user, bool isPersistent)
{
        AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
        AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, await user.GenerateUserIdentityAsync(UserManager));
}

これは、古いASP.NetMVCバージョンでアプリケーションをスキャフォールディングしたことが原因だと思います。説明されている方法は、2013年の http://www.asp.net/identity/overview/getting-started/introduction-to-aspnet-identity にあります。

2
ben

Serdarのソリューションは、クライアントWebアプリケーションとしてAngular)を使用した空のスペースと+シンボルのソリューションの鍵でした。

しかし、ランダムな「無効なトークン」エラーメッセージが表示されることがありました。ユーザーのデータベースへのいくつかのクエリの後、これらのエラーは、ユーザー名にスペースまたはダッシュが含まれているユーザーにのみ発生することがわかりました。

解決策は、UserNamesでこれらの文字を許可するようにUserManagerを構成することでした。つまり、私のユーザーデータベースはDruppalから直接SQL Serverに移行され、それらのユーザーの多くは、ユーザーマネージャーのUserValidatorからのデフォルトポリシーを回避していました。

このスレッドの最後に、英数字以外の文字を許可するようにUserValidatorを構成する方法を見つけることができます。

Asp.NET-ID 2-無効なトークンエラー

2
Josep Alacid

これらのソリューションが機能しない場合-Startup.csに次の構成を追加したため、Asp.NetCoreプロジェクトで問題が発生しました。

services.Configure<RouteOptions>(options =>
{
  options.LowercaseUrls = true;
  options.LowercaseQueryStrings = true;
});

2番目の設定では、確認コードが小文字に変換され、検証が失敗していました。理想的には、クエリ文字列パラメーターを小文字のままにし、クエリ文字列値を変更しないようにしたいのですが、その方法が見つからないため、クエリ文字列設定を削除しました。

services.Configure<RouteOptions>(options =>
{
  options.LowercaseUrls = true;
});
0
DanO