ASP.NET实现匿名访问控制

ASP.NET实现匿名访问控制

通过学习我掌握了两种控制方法,实现了对于网站的匿名访问控制,一个是通过IIS实现,另一个是通过ASP.NET实现。个人感觉两种基本上可以实现的功能没有什么差别,不过通过ASP.NET实现的更易于管理和维护。

对于通过IIS的实现都比较清楚,可以对文件夹或单个文件(页面)设置访问权限,IIS提供了“目录安全性”和“文件安全性”的设置方法。并可以通过直接设置不同访问人的权限。其中就提供了匿名访问的控制方法,这里不再细说。

 

ASP.NET控制方法:

首先介绍例子实现的效果,一个网站登陆以后可以将用户信息保存在一个cookie中,并标识用户是通过身份验证的,在访问其他页面的时候直接对用户的身份是否通过验证进行判断,如果通过即可继续访问页面,如果是一个未通过验证的匿名访问用户(即未登录用户)则将跳转到登陆页面提示用户登录。设置其中一个用户注册页面为可以匿名访问,因为业务逻辑上只有允许注册才能登陆。

在登陆页面还是先对用户的用户名和密码进行验证,至于使用与数据库比对的方法还是到AD中验证等都可以,然后通过以下的方法将当前用户在cookie中标识为通过验证的用户,并跳转到用户跳转到登陆页之前请求的页面。

FormsAuthentication.RedirectFromLoginPage(userName,createPersistentCookie);

FormsAuthentication.RedirectFromLoginPage(UserEmail.Value, PersistCookie.Checked);

在用户直接请求的页面上我们使用如下的方法来验证用户。

Context.User.Identity.IsAuthenticated

Context:获取与该页关联的 System.Web.HttpContext 对象

User:为当前 HTTP 请求获取或设置安全信息

Identity:获取当前用户的标识

IsAuthenticated:获取一个bool值,该值指示是否验证了用户

 

然后我们在Web.config中进行安全设置。

<authentication mode="Forms">

    <forms loginUrl="Login.aspx"></forms>

</authentication>

"Forms" 您为用户提供一个输入凭据的自定义窗体(Web 页),然后在您的应用程序中验证他们的身份。用户凭据标记存储在 Cookie 中。

    <authorization>

        <deny users="?" />

    </authorization>

deny表示禁止,users="?"表示匿名用户

  <location path="NewUser.aspx">

    <system.web>

        <authorization>

            <allow users="*" />

        </authorization>

    </system.web>

  </location>

表示新用户注册页面NewUser.aspx,可以允许任何人访问。

这样就实现了对于匿名用户的访问控制。

对于机密目录,我们可以参照以下的说明:

我们设置机密目录(也就是"安全目录",特定的使用者如管理员才有权限访问的目录)。首先看看你的Web应用程序根目录下是否有 Web.config 这个文件,如果没有就创建一个。你也可以在你的子目录中创建 Web.config 文件,当然,这个 Web.config 文件是有限制的(一些参数它不可以设置)。要实现安全认证,在 Web应用程序根目录下的 Web.config 文件中找到 <system.web> 节点下的

 程序代码
<authentication mode="Windows" />,把它修改为

<authentication mode="Forms">
<forms name="AMUHOUSE.ASPXAUTH"
loginUrl="Login.aspx"
protection="All"
path="./" />
</authentication>
<authorization>
<allow users="*"/>
</authorization>

上面的 name="AMUHOUSE.ASPXAUTH" 中,AMUHOUSE.ASPXAUTH 这个名称是任意的。要控制用户或者用户组的权限,我们可以有两种方法,一是配置在应用程序根目录下的 Web.config 文件,二是在机密目录下创建一个独立的 Web.config 文件。(后者也许会比较好。)如果是前者,这个Web.config 就应该包含有下面的内容(或者类似的内容):


 程序代码
<configuration>
  <system.web>
    <authentication mode="Forms">
      <forms name=" AMUHOUSE.ASPXAUTH"
        loginUrl="login.aspx"
        protection="All"
        path="/"/>
    </authentication>
    <authorization>
      <allow users="*"/>
    </authorization>
  </system.web>
<location path="./Admin">
  <system.web>
    <authorization>
      <!-- 注意!下面几行的顺序和大小写是非常重要的! -->
      <allow roles="Administrator"/>
      <deny users="*"/>
    </authorization>
  </system.web>
</location>
<location path="./User">
  <system.web>
    <authorization>
      <!-- 注意!下面几行的顺序和大小写是非常重要的! -->
      <allow roles="User"/>
      <deny users="*"/>
    </authorization>
  </system.web>
</location>
</configuration>


为了使Web应用程序的目录之前不互相依赖,可以比较方便的改名或者移动,可以选择在每一个安全子目录下配置单独的 Web.config 文件。它只需要配置 <authorization/>节点,如下:


 程序代码
<configuration>
<system.web>
<authorization>
<!-- 注意!下面几行的顺序和大小写是非常重要的! -->
<allow roles="Administrator"/>
<deny users="*"/>
</authorization>
</system.web>
</configuration>


需要再次提醒的是,上面的角色 roles 是大小写敏感的,为了方便,你也可以把上面修改为:
<allow roles="Administrator,administrator" />
如果你想允许或者禁止多个角色对这个目录的访问,可以用逗号隔开,如:
<allow roles="Administrator,Member,User" />
<deny users="*" />

至此,我们已经为网站配置了基于角色的安全认证机制了。你可以先编译你的程序,然后尝试访问一个机密目录,例如 http://localhost/RolebasedAuth/Admin ,这时候你就会被转向到用户登录页面。如果你登录成功,并且你的角色对这个目录有访问权限,你就重新回到这个目录下。可能会有用户(或入侵者)企图进入机密目录,我们可以使用一个 Session 来存储用户登录的次数,超过一定次数就不让用户登录,并且显示"系统拒绝了你的登录请求!"。

下面,我们讨论如何根据用户角色让Web控件显示不同内容。

有时候根据用户的角色来显示内容比较好,因为你可能不想为那么多不同的角色(用户群组)制作一大堆有许多重复内容的页面。这样的网站,各种用户帐户可以并存,付费的用户帐户能够访问附加的付费内容。另一个例子是一个页面将显示一个 "进入后台管理" 按钮链接到后台管理页面如果当前用户是 "Administrator"(高级管理员)角色。我们现在就实现这个页面。
我们上面用到的 GenericPrincipal 类实现了 IPincipal 接口,这个接口有一个方法名叫做 IsInRole(),它的参数是一个字符串,这个字符串就是要验证的用户角色。如果我们要显示内容给角色是 "Administrator"的已登录用户,我们可以在 Page_Load 中添加下面代码:

 程序代码
if (User.IsInRole("Administrator"))
AdminLink.Visible = true;

整个的页面代码如下(为了简便,把后台代码也写在aspx页面):


 程序代码
<html>
<head>
<title>欢迎您!</title>
<script runat="server">
protected void Page_Load(Object sender, EventArgs e)
{
if (User.IsInRole("Administrator"))
AdminLink.Visible = true;
else
AdminLink.Visible = false;
}
</script>
</head>
<body>
<h2>欢迎!</h2>
<p>欢迎来到阿木小屋 http://amuhouse.com/ ^_^</p>
<asp:HyperLink id="AdminLink" runat="server"
Text="管理首页" NavigateUrl="./Admin"/>
</body>
</html>

这样,链接到 Admin 目录的HyperLink 控件只会显示给角色是 Administrator 的用户。你也可以根据为未登录用户提供一个链接到登录页面,如:


 程序代码
protected void Page_Load(object sender, System.EventArgs e)
{

if (User.IsInRole("Administrator"))
{
AdminLink.Text = "管理员请进";
AdminLink.NavigateUrl="./Admin";
}
else if(User.IsInRole("User"))
{
AdminLink.Text = "注册用户请进";
AdminLink.NavigateUrl="./User";

}
else
{
AdminLink.Text = "请登录";
AdminLink.NavigateUrl="Login.aspx?ReturnUrl=" + Request.Path;
}

}


这里,我们通过设置叫做ReturnUrl的 QueryString 变量,可以使用户登录成功后返回到当前的这个页面.

 下面是一个简单例子:

Default.aspx:
<%@ Import Namespace="System.Web.Security " %>

<html>


  <script language="C#" runat=server>

    void Page_Load(Object Src, EventArgs E ) {

      Welcome.Text = "Hello, " + User.Identity.Name;
    }

    void Signout_Click(Object sender, EventArgs E) {

      FormsAuthentication.SignOut();
      Response.Redirect("login.aspx");
    }

  </script>

  <body>

    <h3><font face="宋体">使用 Cookie 身份验证</font></h3>

    <form runat=server>

      <h3><asp:label id="Welcome" runat=server/></h3>

      <asp:button text="注销" OnClick="Signout_Click" runat=server/>

    </form>

  </body>

</html>

login.aspx: 
<%@ Import Namespace="System.Web.Security " %>


<html >


  <script language="C#" runat=server >

    void Login_Click(Object sender, EventArgs E) {
      if (((UserEmail.Value == "jdoe@somewhere.com") && (UserPass.Value == "password")) || ((UserEmail.Value == "mary@somewhere.com") && (UserPass.Value == "password"))) {
        FormsAuthentication.RedirectFromLoginPage(UserEmail.Value, PersistCookie.Checked);
      }
      else {
        Msg.Text = "凭据无效:请再试一次";
      }
    }

  </script >

  <body >

    <form runat=server >

      <h3 > <font face="宋体" >登录页 </font > </h3 >

      <table >
        <tr >
          <td >电子邮件: </td >
          <td > <input id="UserEmail" type="text" runat=server /> </td >
          <td > < ASP:RequiredFieldValidator ControlToValidate="UserEmail" Display="Static" ErrorMessage="*" runat=server/></td>
        </tr >
        <tr >
          <td >密码: </td >
          <td > <input id="UserPass" type=password runat=server /> </td >
          <td > < ASP:RequiredFieldValidator ControlToValidate="UserPass" Display="Static" ErrorMessage="*" runat=server/></td>
        </tr >
        <tr >
          <td >持久的 Cookie: </td >
          <td > < ASP:CheckBox id=PersistCookie runat="server" /> </td>
          <td > </td >
        </tr >
      </table >

      < asp:button text="登录" OnClick="Login_Click" runat=server/>

      <p >

      < asp:Label id="Msg" ForeColor="red" Font-Name="Verdana" Font-Size="10" runat=server />

    </form >
  </body >

</html >
 
web.config:
<configuration >
  <system.web >
      <authentication mode="Forms" >
        <forms name=".ASPXUSERDEMO" loginUrl="login.aspx" protection="All" timeout="60" />
      </authentication >
      <authorization >
        <deny users="jdoe@somewhere.com" />
        <deny users="?" />
      </authorization >
    <globalization requestEncoding="UTF-8" responseEncoding="UTF-8" />
  </system.web >
</configuration >
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值