【发布时间】:2012-06-04 04:02:31
【问题描述】:
背景
我在同一个域下有两个网站。一个网站只封装了登录/账户管理功能,另一个网站是真正的网站。
- LoginWeb - 只有登录页面/css/images/javascript 文件夹允许匿名访问
-
AdminWebsite - 通过表单身份验证完全锁定。即甚至 javascript/images/css 文件夹都没有
<authorization><allow users=*>
我想要达到的目标
这是我正在努力实现的工作流程,并且已经完成了 99% 的工作:
- 如果用户点击 AdminWebsite 上的任何页面,他会被 FormsAuthentication 发送回 LoginWeb
- 用户在登录页面中提供凭据,LoginWeb 网站发出表单身份验证票。用户仍未登录 AdminWebSite。 (这样用户可以去更改密码页面等进行帐户管理功能)
- 用户在 LoginWeb 中再执行两个步骤,现在可以为 AdminWebsite 颁发 FormsAuth 票证并重定向到该票证。
99% 已经在工作了
这是 LoginWeb 中的代码,它尝试为 AdminWeb 发出 FormsAuth 票证,但它不起作用。即 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);
}
这些是我的表单身份验证的 web.config 部分:
登录网站
<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>
【问题讨论】:
-
这是为 Turnkey 和其他人准备的……非常有趣的事情。与常识相反,如果我删除 SetAuthenticationTicket() 函数中的 Domain = "xxx.com" 行,它就会神奇地开始工作。但是,我正在 localhost 上对此进行测试,因此可能与此有关,但这根本没有意义。
-
这可能是关键,因为 localhost 客户端会从浏览器请求 localhost 域的票证。也许将其与为 LOGINWEB 创建的票证进行比较。
标签: c# asp.net-mvc forms-authentication formsauthenticationticket