q4561231 发表于 2015-9-10 12:36:41

Exchange"单点登陆"

我这里的单点登陆指的是在.net应用程序中,进入EXCHANGE的OWA,不用再进行windows身份验证.
   Windows2003的Azman,还有其他一些东西,一个很重要的特征就是安全方面采用AD,结合NTLM等来进行安全与权限方面的验证.例如.net remoting,及安全方案的标配就是远程对象集成到IIS,通过配置web.config来设置权限或控制访问资源等.于是用数据库模拟的方式就比较郁闷点了,需要实现自定义的标识流,在Azman中,还要自定义安全上下文,麻烦挺多的.这是题外话.
   Exchange这东西,每次都是可能要用,或者准备用的时候,猛的上去刨一两天,很多时候都是尽量以解决问题为主了.SDK和E文的资料都看得很粗略.要实现单点登陆,大体上是采用webdav,通过xmlhttp来实现.
" 在服务器端配置好SSL安全通道,以启用安全通道;关于如何配置SSL安全通道,请参阅 http://support.microsoft.com/default.aspx?scid=kb;EN-US;218445 将OWA的认证方式设为“Windows集成身份验证”,不要设为“基于表单的身份验证”(使用Exchange系统管理器);
[*]使用xmlhttp对象发送访问请求,脚本代码如下:
  
//jeseeqing 2004.10.28
//exchangeURL: for example https://VirtualAD.ExchangeTest.Com/Exchange/jeseeqing
  //userName:user name
//password: user password
  function RedirectExchangeURL(exchangeURL,userName,password)
  {
  var xmlRequest= new ActiveXObject("msxml2.xmlhttp");;
  xmlRequest.open("get",exchangeURL,false,userName,password);
  auth.send();
  
  switch(auth.status)
  {
  case 200:
  window.location.href = exchangeURL;
  break;
  case 401:
  alert("Invalid user or password。");
  break;
  default:
  alert("Sorry, Exchange Server is busy, please try later!");
  }
  }

[*]增加一个ASPX页面,在页面的Page_Load事件中注册此脚本,并且传入指定的参数,则会自动跳转到指定的Exchange页面中。 "
以上援引自jeseeqing's technology roadmap      
网址:http://www.cnblogs.com/jeseeqing/archive/2004/11/09/61881.html
  具体做的过程中,却是很郁闷的,首先关于配置SSL一块,其实在OWA中,要修改密码也是必做的工作,我嫌麻烦,省掉了,反正大不了弹出一个需确认的提示框,重要的是先搞明白XMLhttp实现的过程再说. 据小弟回报,配置完认证一块,也就可以在OWA中修改密码了。(该小弟在偶的压迫下,EXCHANGE的配置都精通了)
至于第二步,一般EXCHANGE默认的是windows集成验证,倒是论坛里很多人问如何使用基于表单的验证.
    接着就是代码了,这段是用JSCRIPT写的,先创建一个xmlhttp的实例,然后使用OPEN方法,到auth.send()就出问题了,哪来的auth对象?这里应该是定义一个对象取请求的返回值的.用google又找到几篇和上面一模一样的文章.吐血!C#的例子中是通过发送xml请求实现对EXCAHNGE操作的,xmlhttpClass也有send方法,干脆先将其改为xmlRequest.send()试试再说,就是不知道怎么取得返回的状态值了.
    最后注册脚本,我又迷糊了,Page的方法里有一些注册脚本的,看了几个方法,大致也就是相当于把脚本输出到页面中,干脆直接在HTML页面上写脚本,
    <script language="JScript">   
  var xmlRequest= new ActiveXObject("msxml2.xmlhttp");;
  xmlRequest.open("get",exchangeURL,false,userName,password);
xmlRequest.send();
window.location.href=excahngURL;
  </script>
稀里糊涂就成功了,如果在Page_load事件中,应该就是将上面的脚本和取得的路径,用户名,密码连接成字符串,然后使用Page.RegisterScriptBlock方法注册就ok了.
偶在C#下的处理:



    public void LoginExchange(Page page)
      {
            string url=ConfigurationSettings.AppSettings["ExchangeServer"];
            string user=User.Identity.Name;
            string pwd=Session["pwd"].ToString();
            StringBuilder StrScript = new StringBuilder();
            StrScript.Append( "<script language=javascript>" );
            StrScript.Append("function GoToEmail(){");
            StrScript.Append( "var auth = new ActiveXObject(\"microsoft.xmlhttp\");");
            StrScript.Append( "auth.open(\"get\",\""+url+"\",false,\""+user+"\",\""+pwd+"\");");
            StrScript.Append("auth.send();");
            StrScript.Append( "window.open( \""+url+"\");" );
            StrScript.Append( "}</script>" );
            if ( ! page.IsStartupScriptRegistered( "LoginExchange" ) )
            {
                page.RegisterClientScriptBlock("LoginExchange",StrScript.ToString());
               
            }
      }
页面中在连接前加:就OK了。原本是将上述代码写成了函数,在LinkBotton的onclick事件中调用,但这样页面会刷一次,很难看。最后还存在的问题是,处理到xmlRequest.open("get",exchangeURL,false,userName,password)时,会报JAVASCIPT错误,原因是没有权限。原来EXCHANGE用的是域模式,而在默认的IE设置中,通过域访问数据资源是禁止的。除了改设置,暂时没有好办法解决。2005年8月21日修订。
页: [1]
查看完整版本: Exchange"单点登陆"