1. Single Sign On
目的:多个Web应用有统一的登陆以及一次登陆完成所有Web应用的认证。
原理:利用Form认证,认证后的Cookie,使得参与Web应用的都具有一组相同的用于加密与验证加密的密钥。加密与验证加密的密钥位于 Machine.config 中,修改 <system.web> 节点下的 <machineKey> 节点属性。
应用范围:位于同一服务器上的各个Web应用。
---login.aspx
if(FormsAuthentication.Authenticate(txtUser.Text,txtPassword.Text))
{
FormsAuthentication.RedirectFromLoginPage(txtUser.Text,false);
}
else if(用户认证)
{
Session["UserName"]=txtUser.Text;
FormsAuthentication.SetAuthCookie(txtUser.Text,false);
FormsAuthentication.RedirectFromLoginPage(txtUser.Text,false);
}
else
Response.Write("Login Error...");
}
--Web.Config配置
<authenticationmode="Forms">
<formsname="Shmzh.SingleSignOn"protection="Encryption"timeout="60"loginUrl="login.aspx"/>
</authentication>
<machineKey
validationKey="C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572_487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE"
decryptionKey="8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F"
validation="SHA1">
</machineKey>
<authorization>
<denyusers="?"></deny>
</authorization>
---default.aspx
--Web.Config配置
<authentication mode="Forms">
<forms name="Shmzh.SingleSignOn" protection="Encryption" timeout="60" loginUrl="\SSO\Login.aspx" />
</authentication>
<machineKey
validationKey= "C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE"
decryptionKey= "8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F"
validation="SHA1">
</machineKey>
<authorization>
<deny users="?"></deny>
</authorization>
---default.aspx
--Web.Config配置,每一个站点的配置同
---default.aspx
--Web.Config配置,每一个站点的配置同
---default.aspx
--Web.Config配置,每一个站点的配置同
Default.aspx中的代码
if(User.Identity.IsAuthenticated) //判断是否已经验证
{
//用户验证以及初始化Session
User.Identity.Name 就是登录的用户
}
2. Session过期问题
通过设置Session过期时间来完成
a> IIS中设置过期时间
b> Web.Config中设置时间
<sessionStatemode="InProc"cookieless="false" timeout="20/>
实例2:
HttpContext.Current.User.Identity.IsAuthenticated=false;
HttpContext.Current.User.Identity.Name==""
解释:当用户登录时,服务器为确认客户端通过验证要通过cookie向客户端写验证(Authenticat)信息,在登录页面刚验证完成后服务器 还没有把cookie 回发到Client,所以会没有值,当服务器第二次Response的时候,就会从客户端读取Cookie,要想有此Cookie还要在 web.config文件中配置相应的参数
<system.web>
<authentication mode="Forms">
<forms domain="bokoAdmin" timeout="20" loginUrl="Login.aspx" path="/"></forms>
</authentication>
<authorization>
<allow users="*"/>
</authorization>
<system.web>
程序验证:
if (Membership.ValidateUser(tbx_username.Text.TrimEnd(), tbx_password.Text.TrimEnd()))
{
FormsAuthentication.SetAuthCookie(tbx_username.Text.TrimEnd(), true,FormsAuthentication.FormsCookiePath);
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
1, tbx_username.Text, DateTime.Now, DateTime.Now.AddMinutes(20), false, tbx_username.Text);
// generate new identity
FormsIdentity identity = new FormsIdentity(ticket);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket));
// write to client.
Response.Cookies.Add(cookie);
}
其中加粗体为主要语句,有此一句就可以实现HttpContext.Current.User.Identity.IsAuthenticated=true;