技术开发 频道

[译]SSO解决方案大全

  6. 混合身份验证模式下 (Forms and Windows)实现SSO

Request.ServerVariables["LOGON_USER"]

  上面我们都是处理的Forms认证.要是我们这样设计认证过程呢:先做Forms认证,如果没有通过就检查Intranet用户是否已经在NT域上登录过了.这个思路我们需要检查下面的参数来看和请求关联的Windows logo信息:

    但是除非我们的站点都是禁用匿名登录的,否则这个值总是空的.我们可以在IIS的控制面板禁用匿名登录并为我们的站点启用Windows集成认证.这样LOGON_USER 值就包含了NT域登录用户的名字.但是所有Internet用户的都会遇到用户名和密码的难题,这就不好了,我们要让Internet用户使用Forms认证要是这种方式失败了再使用Windows域认证.

  这个问题的解决方法之一就是为Intranet用户设置一个特殊的入口页面:Windows集成认证方式可用,验证域用户,创建Forms cookie重定向到主站点.我们甚至可以隐藏这样一个事实:由于Server.TransferIntranet用户实际上访问了不同的页面.

  也有一个简单的解决方法.这个方法的基础是IIS掌控认证处理.如果站点对匿名用户可用,IIS就把请求传递给Asp.net运行时.并试图进行认证要是失败了就引发一个401错误.IIS会试图寻找另外该站点的其它认证方式 .你要设置匿名访问和集成认证可用并在Forms认证失败之后执行下面的代码:

if (System.Web.HttpContext.Current.Request.ServerVariables["LOGON_USER"] == "") {
System.Web.HttpContext.Current.Response.StatusCode
= 401;
  System.Web.HttpContext.Current.Response.End();
}
else
{
  
// Request.ServerVariables["LOGON_USER"] has a valid domain user now!
}

 

   这段代码执行时,它会检查域用户并取得一个空的初始值.这回终止当前请求并返回认证的401错误到IIS.这就让IIS自动选择另外的认证机制,Windows集成认证方式就是候选方式.如果用户可以登录到域,请求就可以继续,并附加上了NT域用户的信息. 如果用户没有在域中登录会有三次输入用户名密码的机会.如果三次失败他就会得到一个403错误(AccessDenied).

  结论

  我们考查了在各种场景中在两个Asp.net应用程序间实现SSO.我们也可以在不同系统不同平台间实现SSO,思想都是一样的,只不过实现起来需要创造性思维.

 

0
相关文章