页面集成
烟厂的策略是把各个软件整合在一起,这就有了后来的单点登陆--用户登陆了门户,就可以通过门户直接进入其他平台,而不需要再登陆一次。
单点登陆的原理其实就是把用户名放在Http头集合中,各个平台通过获取Http头中的用户名来判断该用户是否存在,如果存在就直接登陆,跳至主页面。
'获取传递的用户名
Dim userId As String = Context.Request.Headers("iv-user")
单点登录还不够,这不烟厂希望把我们的代办工作页面直接集成在门户的首页。
这个任务涉及的主要的问题其实是网站的身份验证。如果没有通过验证,页面就会跳转至登陆页。但是这个页面是嵌在门户首页的,即使是传入了错误的用户名,也必须显示空白网格,而不是跳转至登陆。开始我想如果用户名错误或者其他错误就得整个默认的用户,好让页面显示空网格。后来想起了RSS的搞法,直接把这个页面放置在RSS目录,这样只有在跳转的时候才需要考虑身份验证的问题。
网站的身份验证配置如下:
<system.web>
<authentication mode="Forms">
<forms name=".pdrms" loginUrl="login.aspx" protection="All" timeout="120"/>
</authentication>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
身份认证采取了Forms格式,name属性是包含身份验证票证的 Cookie 的名称设置的后缀。
后台通过 System.Web.Security.FormsAuthentication.SetAuthCookie("userId", True)方法进行认证。该方法的作用是为提供的用户名创建一个身份验证票证,并将其添加到响应的 Cookie 集合或 URL。
在web.Config中添加Local节点。
<location path="Rss">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>
这个配置的作用是让网站RSS目录下的所有页面不受身份验证的限制,可以任意访问。
知道了这些知识就好办了。因为页面是放置在RSS目录下,当出现错误的时候将显示空白网格,而不会跳转至登陆页。如果是正确的用户名,则利用SetAuthCookie方法进行认证,再给程序用到的Session赋值,当用户点击某代办事务时就可跳至系统相关的页面,当然这些页面并不在RSS目录。
页面运行后发现数据过多,把表格撑高了。而门户要求必须是255像素。这样就必须对数据先按时间排序再截取前N条。可以利用DB2的 RowNumber() over() 函数生成行号。然后再根据行号截取前N条记录。
后来还遇到了一个样式问题。GridView中的HyperLinkField默认的样式是黑色带下划线,鼠标移动到上方时呈手型。这和系统的样式并不统一。后来才发现是样式的问题,把系统的样式拷过来就一样了。
a, a:visited
{
color: #006699;
text-decoration: none;
}这个样式让HyperLink呈蓝色,并去掉了下划线。text-decoration: none这句让所有修饰失效。
A:hover
{
text-decoration: underline;
color: #ff5555;
}这个样式让鼠标移动到HyperLink上时出现下划线,文本呈红色。