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页面中。 "
网址: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#下的处理:
{
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日修订。