C# asp.net 2.0-4.0中的双表单身份验证
背景 我在同一个域名下有两个网站。一个网站仅封装登录/帐户管理功能,另一个网站是真实的网站C# asp.net 2.0-4.0中的双表单身份验证,c#,asp.net-mvc,forms-authentication,formsauthenticationticket,C#,Asp.net Mvc,Forms Authentication,Formsauthenticationticket,背景 我在同一个域名下有两个网站。一个网站仅封装登录/帐户管理功能,另一个网站是真实的网站 登录Web-只有登录页面/css/images/javascript文件夹允许匿名访问 管理员网站-通过表单验证完全锁定。i、 e甚至javascript/images/css文件夹都没有 我正在努力实现的目标 这是我正在努力实现的工作流程,已经完成了99%: 如果用户点击管理员网站上的任何页面,他将通过FormsAuthentication返回到登录网站 用户在登录页面中提供凭据,并且LoginWe
- 登录Web-只有登录页面/css/images/javascript文件夹允许匿名访问
- 管理员网站-通过表单验证完全锁定。i、 e甚至javascript/images/css文件夹都没有
我正在努力实现的目标 这是我正在努力实现的工作流程,已经完成了99%:
这是LoginWeb中的代码,它试图为AdminWeb颁发FormsAuth票证,但不起作用。i、 e AdminWeb仍在将我重定向回登录。我确信我遗漏了一些非常琐碎的东西,但我不知道它到底是什么
public void SetAuthenticationTicket(string username)
{
MachineKeySection sec=(MachineKeySection)WebConfigurationManager.OpenWebConfiguration("").SectionGroups["system.web"].Sections["machineKey"];
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
username,
DateTime.Now,
DateTime.Now.AddMinutes(30),
false, //true or false
sec.DecryptionKey, //Custom data like your webkey can go here
FormsAuthentication.FormsCookiePath);
var encryptedTicket = FormsAuthentication.Encrypt(ticket);
var cookie = new HttpCookie("ADMINWEB", encryptedTicket)
{
Path = FormsAuthentication.FormsCookiePath,
Domain = "xxx.com"
};
Response.AppendCookie(cookie);
}
以下是Forms Auth的my web.config部分:
LoginWeb
<machineKey validationKey="XXXXXX" decryptionKey="XXX" validation="SHA1"/>
<authentication mode="Forms">
<forms name="LoginWeb"
domain="xxx.com"
loginUrl="~/account/Logon"
timeout="1440"
cookieless="UseCookies"
slidingExpiration="false"
protection="All"
path="/"/>
</authentication>
管理员网站
<machineKey validationKey="XXXXXX" decryptionKey="XXX" validation="SHA1"/>
<authentication mode="Forms">
<forms name="ADMINWEB"
domain="xxx.com"
loginUrl="http://loginweb/account/Logon"
timeout="1440"
cookieless="UseCookies"
slidingExpiration="false"
protection="All"
path="/"/>
</authentication>
<authorization>
<deny users="?"/>
</authorization>
此站点意味着表单属性上的名称应该相同。我想你误解了我想要实现的目标。这两个网站使用Forms Auth(如您所说,在Forms元素中使用相同的名称)已经可以正常工作。但我尝试不这样做。例如,我希望LoginWeb有一个单独的Forms Auth cookie/ticket,AdminWeb有一个单独的Forms Auth cookie/ticket。但是LoginWeb也应该能够为AdminWeb发出ticket。(请参阅上面名为SetAuthenticationTicket()的函数)。这是为具有相同表单名称的AdminWeb颁发票证的票证。对此感到抱歉。我不确定如果没有一些特殊的单点登录代码,这是否可以完成。这是针对Turnkey和其他人的……非常有趣的事情。与常识相反,如果我删除SetAuthenticationTicket()中的Domain=“xxx.com”行功能,它神奇地开始工作。我正在localhost上测试此功能,因此它可能与此有关,但毫无意义。这可能是关键,因为localhost客户端将从浏览器请求localhost域的票证。可能会将其与为LOGINWEB创建的票证进行比较。