我想从AccountController
中的ConfirmEmail
操作中删除UserId
查询字符串,因为我不希望UserId
's在电子邮件消息中发送。
一旦我这样做了,我仍然需要获得UserId
以便调用UserManager.ConfirmEmailAsync
方法。为了做到这一点,我计划要求对ConfirmEmail
操作进行身份验证。这样我就可以调用User.Identity.GetUserId()
来获得确认电子邮件地址所需的UserId
参数。
登录后,如果用户的电子邮件地址没有被确认,他们将被重定向到ConfirmEmail
页面。此外,我想在每个页面加载上实施检查,看看用户的电子邮件是否得到确认,如果不是,我希望他们被重定向到ConfirmEmail
页面。
我的问题如下:
- 我该如何在每个页面上执行此检查?
- 检查用户的电子邮件是否在每个页面上都得到确认会有很大的性能损失吗?如果是这样,将确认的值存储在会话变量中并检查是否更好?
- 如果我最终使用会话变量,它可以很容易地被用户删除或更改吗?
- 我完全走错轨道了吗?有更好的方法吗?
谢谢你的帮助!
我该如何在每个页面上实现这个检查呢?
您可以使用动作过滤器来实现此目的。通过简单地将属性应用于像AOP(面向方面的编程)这样的操作方法,它们与方法进入和方法退出策略一起工作。
如果检查用户的电子邮件是否在每个页面上都得到确认,会有很大的性能损失吗?如果是这样,将确认的值存储在会话变量中并检查是否更好?
这取决于你如何实现它以及检查操作的成本是多少。在会话中保持信息始终是一个简单的想法,但这不是一个好的实践,当您跨服务器扩展应用程序时,稍后会看到这一点。然后你回到会话和会话类型,以及我应该在会话中存储什么信息。这取决于不同的情况
您可以将此信息作为cookie中的简单标志。然后你可以创建一个动作过滤器来检查cookie,如果它的请求有这些信息,例如。"尚未确认"。如果不是,就忽略它。您可以在用户确认电子邮件地址后使cookie无效。