我使用默认模板创建了两个不同的 asp.net MVC 应用程序,并同时启动这两个应用程序,当我使用站点 A 登录并刷新站点 B 时,站点 B 尝试使用站点 A 的登录详细信息。我该如何阻止它?
我怀疑您的防伪令牌有问题。默认情况下,我添加到我的新MVC项目中的内容是这样的(添加到Global.asax):
AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.NameIdentifier;
我认为这个SO答案提供了一个相当完整的概述
身份验证通过 cookie 持久保存,并且 cookie 是域绑定的。与域关联的所有 Cookie 都将发送到该域的请求中,无论组合中有多少个实际网站。尽管尚未指定,但您很可能在不同的本地主机端口下开发和加载站点。重要的是要知道,不同的端口不足以阻止共享 Cookie。在所有情况下,在本地开发时,域将被localhost
,并且 cookie 将在 localhost 上运行的所有站点之间共享。
您有几个选择。最简单的选择是简单地为每个站点自定义身份验证 cookie 名称。如果您使用的是 ASP.NET 身份,只需将以下属性添加到您的 cookie 身份验证配置中:
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
...
CookieName = "foo",
});
如果这两个网站使用不同的身份验证cookie(基于名称),那么它们是否都收到两者并不重要;它们只会查看属于它们的那个。
第二种选择是使用本地主机以外的其他东西。例如,您可以使用类似 localtest.me 的东西。这是一个有助于将所有子域重定向到本地主机的域。这样,您可以通过site1.localtest.me:12345
和site2.localtest.met:54321
之类的东西测试您的网站(请注意,端口将与仅使用localhost
的端口相同)。但是,由于这些现在是不同的域,因此将不再共享cookie。但是,这样做需要对IIS Express的ApplicationHost.config文件进行更改,如果您不小心,可能会搞砸某些东西。它也将仅限于您的特定计算机,因此任何其他开发人员都需要在其计算机上进行相同的更改。更改 Cookie 名称将普遍适用。