流星小筑
火流星一闪即逝,只留给人们许下心愿的瞬间

导航

 
我这里的单点登陆指的是在.net应用程序中,进入EXCHANGE的OWA,不用再进行windows身份验证.
   Windows2003的Azman,还有其他一些东西,一个很重要的特征就是安全方面采用AD,结合NTLM等来进行安全与权限方面的验证.例如.net remoting,及安全方案的标配就是远程对象集成到IIS,通过配置web.config来设置权限或控制访问资源等.于是用数据库模拟的方式就比较郁闷点了,需要实现自定义的标识流,在Azman中,还要自定义安全上下文,麻烦挺多的.这是题外话.
   Exchange这东西,每次都是可能要用,或者准备用的时候,猛的上去刨一两天,很多时候都是尽量以解决问题为主了.SDK和E文的资料都看得很粗略.要实现单点登陆,大体上是采用webdav,通过xmlhttp来实现.
"
  1. 在服务器端配置好SSL安全通道,以启用安全通道;关于如何配置SSL安全通道,请参阅 http://support.microsoft.com/default.aspx?scid=kb;EN-US;218445
  2. OWA的认证方式设为“Windows集成身份验证”,不要设为“基于表单的身份验证”(使用Exchange系统管理器);
  3. 使用xmlhttp对象发送访问请求,脚本代码如下:

 

//jeseeqing 2004.10.28

//exchangeURL: for example https://VirtualAD.ExchangeTest.Com/Exchange/jeseeqing

//userNameuser 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!");

}

}

  1. 增加一个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());
                
            }

        }

页面中在连接前加:onClick="GoToEmail()"就OK了。原本是将上述代码写成了函数,在LinkBotton的onclick事件中调用,但这样页面会刷一次,很难看。最后还存在的问题是,处理到xmlRequest.open("get",exchangeURL,false,userName,password)时,会报JAVASCIPT错误,原因是没有权限。原来EXCHANGE用的是域模式,而在默认的IE设置中,通过域访问数据资源是禁止的。除了改设置,暂时没有好办法解决。2005年8月21日修订。
posted on 2005-04-14 23:51  风渐寒pro  阅读(2860)  评论(2编辑  收藏  举报