从 ConfirmEmail 操作中删除 UserId 并对每个页面加载实施检查

Remove UserId from ConfirmEmail action and implement a check on every page load

我想从 AccountControllerConfirmEmail 操作中删除 UserId 查询字符串,因为我不想发送 UserId在电子邮件中。

执行此操作后,我仍需要获取 UserId 才能调用方法 UserManager.ConfirmEmailAsync。为此,我计划要求对 ConfirmEmail 操作进行身份验证。这样我就可以调用 User.Identity.GetUserId() 来获取确认电子邮件地址所需的 UserId 参数。

登录后,如果未确认用户的电子邮件地址,他们将被重定向到 ConfirmEmail 页面。此外,我想对每个页面加载进行检查,以查看用户的电子邮件是否已确认,如果不是,我希望将他们重定向到 ConfirmEmail 页面。

我的问题如下:

  1. 我将如何在每个页面上执行此检查?
  2. 检查用户的电子邮件是否在每个页面上都得到确认会不会有很大的性能损失?如果是这样,将确认的值存储在会话变量中并检查它会更好吗?
  3. 如果我最终使用了会话变量,用户可以轻松删除或更改它吗?
  4. 我走错路了吗?有更好的方法吗?

感谢您的帮助!

How would I go about implementing this check on every page?

您可以使用 action filters 来实现此目的。它们通过简单地在 Action 方法(如 AOP(面向方面​​的编程))上应用属性来与方法进入和方法退出策略一起工作。

Would there be a large performance penalty on checking if a user's email is confirmed on every page? If so, would it be better to store the confirmed value in a session variable and check that instead?

这取决于你如何实现它以及检查操作的成本是多少。将信息保存在会话中总是一个简单的想法,但稍后当您跨服务器扩展应用程序时,这不是一个好的做法。然后你返回会话和会话类型以及我应该在会话中存储哪些信息。所以还是要看各种场景。

您可以将此信息作为简单标志保存在 cookie 中。然后,您可以创建一个操作过滤器,如果它请求具有该信息,它将检查 cookie,例如"Not yet confirmed"。如果不是就忽略它。一旦用户确认了电子邮件地址,您就可以使 cookie 无效。