提前通行证,首先想到的是,经常用的网易的站内通行证,一处登陆,畅通无阻,怎么样,很方便吧?
所以,在多系统中,该做法很是盛行,比如在企业级系统应用中。
提个概念,那就是“单点登录”:
单点登录(Single Sign On),简称为 SSO,是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
是目前比较流行的企业业务整合的解决方案之一。
多说点,其实现机制:
当用户第一次访问应用系统1的时候,因为还没有登录,会被引导到认证系统中进行登录;根据用户提供的登录信息,认证系统进行身份效验,如果通过效验,应该返回给用户一个认证的凭据--ticket;用户再访问别的应用的时候,就会将这个ticket带上,作为自己认证的凭据,应用系统接受到请求之后会把ticket送到认证系统进行效验,检查ticket的合法性。如果通过效验,用户就可以在不用再次登录的情况下访问应用系统2和应用系统3了。
可以看出,要实现SSO,需要以下主要的功能:
所有应用系统共享一个身份认证系统;
所有应用系统能够识别和提取ticket信息;
应用系统能够识别已经登录过的用户,能自动判断当前用户是否登录过,从而完成单点登录的功能。
其中统一的身份认证系统最重要,认证系统的主要功能是将用户的登录信息和用户信息库相比较,对用户进行登录认证;认证成功后,认证系统应该生成统一的认证标志(ticket),返还给用户。另外,认证系统还应该对ticket进行效验,判断其有效性。整个系统可以存在两个以上的认证服务器,这些服务器甚至可以是不同的产品。认证服务器之间要通过标准的通讯协议,互相交换认证信息,就能完成更高级别的单点登录。
补充一下:单点登录的实质就是是含有身份验证票的Cookie能在项目间共用。
asp.net提供的验证方法:
ASP.NET 的安全认证,共有“Windows”“Form”“Passport”“None”四种验证模式。
windows验证即“IIS验证”,因为它主要是通过IIS实现的,毕竟用户请求页面时,首先遇到的是IIS,之后由IIS交给asp.net应用程序,因为iis赋予的身份由windows用户定义的,所以又叫windows验证;
“Windows”与“None”没有起到保护的作用,不推荐使用;
“Form”“Passport” 之间,前者,“Form”验证用的广泛一些,重点了解一下。
Form验证是提交给服务器做的;步骤如下:
1、客户请求站点被保护的页面;
2、如果请求没有包含有效的认证cookie,web服务器将把用户重定向到web.config文件Authentication标签的LoginURL属性指定的URL,该URL提供一个供用户登录的表单;
3、认证被输入到表单中,并通过表单传送并被提交;
4、如果认证有效,则asp.net程序在本地创建一个认证cookie;
5、之后,用户被重定向到最初请求的页面;
认证设置成功之后,以后的请求自动被认证;
认证有效期:关闭浏览器或会话结束;
passport验证是通过订阅微软应用程序完成的;
(所谓认证的通过与否,其实质就是检测有无发放有效的Cookie,使用Form也好,运用Passport也罢,都是Cookie在起作用。也就是说,我们只要把有效的Cookie在登录后一次性发放给客户端就得了。)
使用Form验证方法实现单点登录简单示例:
一、修改 Web.config
1、 打开项目中的Web.config;
2、 找到 <authentication mode="Windows" /> 把它改成:
<authentication mode="Forms">
<forms loginUrl="Login.aspx" name=".ASPXAUTH"></forms>//Login.aspx为登录页面;
</authentication>
3、 找到<authorization> <allow users="*" /></authorization>改成
<authorization><deny users="?"></deny></authorization>
<authentication mode="Forms">
<forms loginUrl="Login.aspx" name=".APSX"></forms>
<deny users="?"></deny>
</authentication>
二、 编写 .cs 代码——登录与退出
1、 登录代码:
a、 private void Btn_Login_Click(object sender, System.EventArgs e)
{
if(this.Txt_UserName.Text=="admin" && this.Txt_Password.Text=="admin")
{
System.Web.Security.FormsAuthentication.RedirectFromLoginPage(this.Txt_UserName.Text,false);
}
}
b、 private void Btn_Login_Click(object sender, System.EventArgs e)
{
if(this.Txt_UserName.Text=="admin" && this.Txt_Password.Text=="admin")
{
System.Web.Security.FormsAuthentication.SetAuthCookie(this.Txt_UserName.Text,false);
Response.Redirect("Default.aspx");
}
}
以上两种都实现发放验证后的 Cookie ,通过验证的重要步骤:
方法 a) 指验证后返回登录前的请求页面;
方法 b) 则是分两步走:通过验证后就直接发放 Cookie ,跳转页面将由程序员自行指定(Response.Redirect("Default.aspx")),此方法多用于 Default.aspx 使用框架结构的系统;
2、 退出代码:
private void Btn_LogOut_Click(object sender, System.EventArgs e)
{
System.Web.Security.FormsAuthentication.SignOut();
}
三、如何判断验证与否及获取验证后的用户信息
一种方法用 Session 来判断;
还有一种方法,且看下面代码:
if(User.Identity.IsAuthenticated)
{
//你已通过验证,知道该怎么做了吧?
}