【问题标题】:ASP.Net Identity GenerateEmailConfirmationTokenAsync failsASP.Net Identity GenerateEmailConfirmationTokenAsync 失败
【发布时间】:2017-03-07 10:36:11
【问题描述】:

我正在开发一个 MVC 项目,以将身份信息与启动的 MVC 项目分开。执行该行时的用户注册

UserManager.GenerateEmailConfirmationTokenAsync(userId)

它会抛出带有消息的 System.ArgumentException

如果指定了用途列表,则该列表不能包含空条目或仅由空白字符组成的条目。 参数名称:用途

堆栈跟踪

at System.Web.Security.MachineKey.Protect(Byte[] userData, String[] purposes)
   at Microsoft.Owin.Host.SystemWeb.DataProtection.MachineKeyDataProtector.Protect(Byte[] userData)
   at Microsoft.Owin.Security.DataProtection.AppBuilderExtensions.CallDataProtectionProvider.CallDataProtection.Protect(Byte[] userData)
   at Microsoft.AspNet.Identity.Owin.DataProtectorTokenProvider`2.<GenerateAsync>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNet.Identity.UserManager`2.<GenerateUserTokenAsync>d__fe.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at Robot.ACG.Web.Controllers.AccountController.<Register>d__15.MoveNext() in...

有什么想法吗?

【问题讨论】:

  • 你确定在这行提示错误吗?
  • 在调试时会在这一行抛出。
  • 什么是userId?什么类型?
  • 我在此行上方创建用户并将创建的用户 ID 放入其中。就我而言,这是一个 int。
  • 根据 Microsoft 的说法,此方法需要一个 TKey 参数。查看此线程,获取正确的 user 对象并传递其 `id´ propertystackoverflow.com/questions/22755700/…

标签: c# asp.net asp.net-mvc asp.net-identity


【解决方案1】:

GenerateEmailConfirmationTokenAsync 生成一个令牌。问题可能来自您的不同服务器:

如果您的令牌是在一台服务器上生成的,然后尝试在另一台服务器上验证它。原因是令牌是通过 MachineKey.Protect 保护的。这是在 OWIN 初始化时配置的。

来自Max Vasilyev, Trailmax Tech

【讨论】:

  • 在我的情况下,我有两个项目在同一个解决方案中。所以我希望机器钥匙是一样的。我也尝试在 web.config 中使用 machinekey。还是一样。
  • 一切都与令牌有​​关。如果您调用 ConfirmEmailAsync,则令牌将传递给 VerifyUserTokenAsync(userId, "Confirmation", token) ,其中“确认”是一个目的。
  • @AsiriDissa:机器密钥与解决方案无关。默认情况下,在 IIS 中为每个站点生成机器密钥。如果需要在站点之间共享机器密钥,则需要在IIS中生成一个,然后在每个站点的Web.config中手动应用。
【解决方案2】:

我认为你的问题是你不应该传递一个 Id,而是一个用户,至少在你使用 asp.net Core 时:

UserManager.GenerateEmailConfirmationTokenAsync(user)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 1970-01-01
    • 2014-09-06
    • 2014-04-23
    • 1970-01-01
    • 2020-11-19
    • 2020-10-20
    相关资源
    最近更新 更多