1.1 移动Web网站安全性
ASP.NET中的安全性由三个不同的方面组成:身份验证、授权和加密。.NET Framework与Internet信息服务(IIS)一起提供这方面的支持,以保护Web应用程序。要编写安全的Web应用程序,了解配置选择将影响应用程序的安全性是很重要的。ASP.NET依赖于IIS和ASP.NET的基础结构来保护应用程序。
.NET Framework支持集成Windows身份验证与授权、Microsoft Passport身份验证和窗体身份验证。但是由于各种原因,目前只有窗体身份验证方式适合用于移动设备。本节介绍适合移动设备的窗体身份验证方案,以及为确保各种设备可以访问应用程序所必须采取的步骤。
1.1.1 窗体身份验证
由ASP.NET提供的窗体身份验证支持在应用程序中创建登录页并管理身份验证,并且不需要使用计算机上或域中的单独帐户。窗体身份验证的基本思路是在每个请求中检查身份验证Cookie。如果未找到Cookie、Cookie无效或Cookie过期,则用户被重定向到登录页(默认情况下,该页为login.aspx)。提供窗体身份验证的登录页与任何.aspx页相同。该登录页上有一个供用户提交凭据的窗体。当用户发送要求的数据时,将在代码中执行身份验证检查,然后用户将被重定向到当初请求的页,并且记录该Cookie。
某些设备和设备网关在执行重定向时不记录Cookie。在这种情况下,再次发送原始请求时意味不带所需的身份验证Cookie,因此用户将被再次重定向到登录页。对于不支持Cookie的设备,解决方法是将身份验证添加到URL的查询字符串中。
为了演示窗体身份验证,需要修改web.config文件,并且添加默认登录页面login.aspx和一个测试登录的页面FormsAuth.aspx。在web.config文件需要添加以下配置:
<authentication mode="Forms" />
<authorization>
<deny users="?" />
</authorization>
login.aspx页面的窗体设计如图18-15所示,对应的login.aspx.vb文件代码如清单18-21所示。FormsAuth.aspx页面对应的FormsAuth.aspx.vb文件代码如清单18-22所示。
图18-15:login.aspx窗体设计
清单18-21:login.aspx.vb
Partial Class WebSecurity
Inherits System.Web.UI.MobileControls.MobilePage
Protected Sub cmdLogin_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles cmdLogin.Click
If UserEmail.Text = "software2002" And UserPass.Text = "123456" Then
Mobile.MobileFormsAuthentication.RedirectFromLoginPage(UserEmail.Text, False)
Else
message.Visible = True
message.Text = "登录用户名和密码不正确"
End If
End Sub
End Class
图18-16:FormsAuth.aspx窗体设计
清单18-22:FormsAuth.aspx.vb
Partial Class FormsAuth
Inherits System.Web.UI.MobileControls.MobilePage
Protected Sub formA_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles formA.Load
label1.Text = String.Format("Welcome {0}", User.Identity.Name)
End Sub
Protected Sub cmdLoginOut_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles cmdLoginOut.Click
Mobile.MobileFormsAuthentication.SignOut()
ActiveForm = formB
End Sub
End Class
清单18-21中演示了MobileFormsAuthentication的用法。在该示例中验证以software2002为用户名,以123456为密码的用户登录。清单18-22中的System.Web.Mobile.MobileFormsAuthentication的SignOut方法,用于清除Cookie或额外的查询字符串参数。