Asp.Net 使用子域进行表单身份验证

本文关键字:表单 身份验证 Net Asp | 更新日期: 2023-09-27 18:33:12

我正在使用 mvc 5 运行单个 asp.net 4.5.2 应用程序。 我有自定义例程来处理应用程序每个区域的子域。

我在其中一个区域(配置文件(中拥有我的用户身份验证,这是它自己的子域。 在导航栏中,有一个登录表单,用于 POST 到配置文件控制器的 Login(( 操作。 由于这是一个子域,因此我正在手动设置身份验证的域信息,以使其在所有子域中工作。

对于我的生活,我不知道如何让它工作。 我尝试将表单身份验证域设置为TLD,带有.在前面,在WebConfig中带有表单信息,没有。

以下是有关表单身份验证的重要部分:

网络配置

<system.web>
  <authentication mode="Forms">
  <forms domain=".teknik.io" protection="All" enableCrossAppRedirects="true" name="TeknikAuth" />
  </authentication>
</system.web>
<system.webServer>
  <modules>
    <remove name="FormsAuthentication" />
    <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" />
  </modules>
</system.webServer>

配置文件控制器

public ActionResult Login(LoginViewModel model)
{
  ...
  authcookie.Name = "TeknikAuth";
  authcookie.HttpOnly = true;
  authcookie.Secure = true;
  authcookie.Domain = string.Format(".{0}", Config.Host); // ".teknik.io"
  Response.Cookies.Add(authcookie);
  ...
}

更新 1

我已经确定它正在我的开发域(单个域(上工作,当我访问主域时,cookie 仍在工作。 两者之间的唯一区别是,在 dev 上,登录请求位于同一子域上,而在生产环境中,它将请求发送到另一个子域。

Asp.Net 使用子域进行表单身份验证

所以我找出了问题所在。 登录(并设置 cookie(时,我向与当前所在的域不同的域发送了 post 请求 (profile.teknik.io/Login(。 由于某种原因,这没有设置正确的cookie,因此没有发生身份验证。 将登录名移动到父域后,身份验证在子域中正常工作。

更新 1

真正的问题是 ajax 登录请求。 它没有启用 CORS,因此一旦我这样做并添加了适当的允许标头,请求就会起作用并且 cookie 将正确保存。