Asp.Net 使用子域的表单身份验证
Asp.Net Forms Authentication with Subdomains
我是 运行 一个使用 mvc 5 的 asp.net 4.5.2 应用程序。我有自定义例程来处理应用程序每个区域的子域。
我在其中一个区域(配置文件)中拥有我的用户身份验证,这是它自己的子域。在导航栏中,有一个登录表单,它发送到 Profile 控制器的 Login() 操作。由于这是一个子域,我手动设置身份验证的域信息以使其在所有子域中工作。
对于我的生活,我不知道如何让它工作。我试过将 Form Auth 域设置为 TLD,TLD 扩展名为 .在前面,在 webconfig 中有表单信息,没有。
以下是有关表单授权的重要信息:
Web.Config
<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 上,登录请求在同一个子域上,而在生产上,它将请求发送到另一个子域。
所以我弄清楚出了什么问题。登录(并设置 cookie)时,我向与当前所在域不同的域 (profile.teknik.io/Login) 发送 post 请求。由于某种原因,这没有设置正确的 cookie,因此没有发生身份验证。一旦我将登录名移动到 parent 域,身份验证就可以跨子域正常工作。
更新 1
真正的问题是 ajax 登录请求。它没有启用 CORS,所以一旦我启用了它,并添加了适当的允许 headers,请求就会工作并且cookie 将被正确保存。
我是 运行 一个使用 mvc 5 的 asp.net 4.5.2 应用程序。我有自定义例程来处理应用程序每个区域的子域。
我在其中一个区域(配置文件)中拥有我的用户身份验证,这是它自己的子域。在导航栏中,有一个登录表单,它发送到 Profile 控制器的 Login() 操作。由于这是一个子域,我手动设置身份验证的域信息以使其在所有子域中工作。
对于我的生活,我不知道如何让它工作。我试过将 Form Auth 域设置为 TLD,TLD 扩展名为 .在前面,在 webconfig 中有表单信息,没有。
以下是有关表单授权的重要信息:
Web.Config
<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 上,登录请求在同一个子域上,而在生产上,它将请求发送到另一个子域。
所以我弄清楚出了什么问题。登录(并设置 cookie)时,我向与当前所在域不同的域 (profile.teknik.io/Login) 发送 post 请求。由于某种原因,这没有设置正确的 cookie,因此没有发生身份验证。一旦我将登录名移动到 parent 域,身份验证就可以跨子域正常工作。
更新 1
真正的问题是 ajax 登录请求。它没有启用 CORS,所以一旦我启用了它,并添加了适当的允许 headers,请求就会工作并且cookie 将被正确保存。