アカウントを確認しようとしていますが、「無効なトークン」を取得しています。エラー。
これが私が試していることです:
_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>
を呼び出すことにしましたが、同じエラーが発生します。
手がかりはありますか?
転送中のコードがブラウザによって変更されている可能性があります。トークンでUrlEncodeを実行してみてください。
var code = await userManager.GenerateEmailConfirmationTokenAsync(userId);
code = System.Web.HttpUtility.UrlEncode(code);
それ以外の場合、ブラウザはトークンに存在する可能性のある特別な記号をいじります。
同じ問題が発生しました。次のコードで問題を解決しました。
サンプル:
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);
}
}
わかりました、これは私の人生の無駄な時間-いや、日-です。このスレッドで他のすべての提案を試した後、 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 にあります。
Serdarのソリューションは、クライアントWebアプリケーションとしてAngular)を使用した空のスペースと+シンボルのソリューションの鍵でした。
しかし、ランダムな「無効なトークン」エラーメッセージが表示されることがありました。ユーザーのデータベースへのいくつかのクエリの後、これらのエラーは、ユーザー名にスペースまたはダッシュが含まれているユーザーにのみ発生することがわかりました。
解決策は、UserNamesでこれらの文字を許可するようにUserManagerを構成することでした。つまり、私のユーザーデータベースはDruppalから直接SQL Serverに移行され、それらのユーザーの多くは、ユーザーマネージャーのUserValidatorからのデフォルトポリシーを回避していました。
このスレッドの最後に、英数字以外の文字を許可するようにUserValidatorを構成する方法を見つけることができます。
これらのソリューションが機能しない場合-Startup.csに次の構成を追加したため、Asp.NetCoreプロジェクトで問題が発生しました。
services.Configure<RouteOptions>(options =>
{
options.LowercaseUrls = true;
options.LowercaseQueryStrings = true;
});
2番目の設定では、確認コードが小文字に変換され、検証が失敗していました。理想的には、クエリ文字列パラメーターを小文字のままにし、クエリ文字列値を変更しないようにしたいのですが、その方法が見つからないため、クエリ文字列設定を削除しました。
services.Configure<RouteOptions>(options =>
{
options.LowercaseUrls = true;
});