浅谈asp.net Forms身份验证详解

2019-05-26 03:05:22王冬梅

<fieldset>
    <legend>用户登陆</legend>
    <div>
      用户名:<asp:TextBox ID="txtUserID" runat="server" Width="150" /><br /><br />
      密   码:<asp:TextBox ID="txtUserPWD" runat="server" TextMode="Password" Width="150" /><br /><br />
      <asp:CheckBox ID="cbSaveUserName" runat="server" Checked="true" Text="保持登录状态" />
    </div><br />
    <asp:Literal ID="ltMessage" Text="" runat="server" Visible="false" />
    <br />
    <p>
      <asp:Button ID="btnLogin" Text="登陆" runat="server" OnClick="btnLogin_Click" />
    </p>
  </fieldset>

接下来完成后台代码,添加登陆按钮的后台处理方法:对用户名和密码进行验证,如果验证通过,则为用户名创建一个身份验证票据,并将其添加到响应的Cookie中。代码如下:

protected void btnLogin_Click(object sender, EventArgs e)
    {
      string userID = this.txtUserID.Text.Trim();
      string userPWD = this.txtUserPWD.Text.Trim();

      SampleUser userEx = SampleUser.GetUser(userID);
      if (userEx == null)
      {
        ltMessage.Text = "用户不存在!";
        ltMessage.Visible = true;
        return;
      }

      if (userEx.UserPWD != userPWD)
      {
        ltMessage.Text = "用户名或密码错误,请重新输入!";
        ltMessage.Visible = true;
        return;
      }

      //添加票据,并将用户导航到默认页面
      FormsAuthentication.RedirectFromLoginPage(userEx.UserName, this.cbSaveUserName.Checked);
    }

完成这一步后,我们就已经完成了简单Froms验证的功能。运行程序,你会发现,这里存在一个问题!!!

你发现了吗?当我们被导航到login.aspx时,这个页面的样式丢失了!这是因为我们对整个网站的资源进行了访问限制,如果没有登陆,用户不仅无法访问.aspx页面,甚至连css文件、js文件都无法访问。显然,这不是我们想要的,因为这些资源并不是敏感的资源。在通常情况下,我们只希望对部分文件夹中的文件进行验证访问限制,而不是整个网站,例如,我们允许只对User文件夹下的页面进行访问限制,因为这个文件夹中存放的是用户的私人信息,这些信息是敏感的。这该如何实现呢?

为了完成演示分目录验证,我们在项目中添加一个User文件夹,并添加UserInfo.aspx、 UserLogin.aspx两个页面。UserInfo.aspx用来展示用户信息,它的业务逻辑我们不是我们关心的,UserLogin.aspx页面用来让用户登陆,代码跟Login.aspx页面几乎完全相同。

第一步:修改Web.config文件,允许匿名用户访问系统资源。

 <authorization>
   <allow users="?"/>
  </authorization>

第二步:在User文件夹下添加一个Web.config文件,修改代码,拒绝匿名用户访问该文件夹下的资源。