ASP.NET实现匿名访问控制

发布时间: 2007-01-25 11:48    作者: 未知    来源: 未知    浏览:    评论

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>


TAG

Smile Big Smile Surprise Stick out tongue Wink Sad Tongue Tied Indifferent Crying Embarrassed Cool Angry Angel Devil [8-|] [:#] [:-*] [:^)] [<:o)] [|-)] Yes Beer Left Hug Music Star Time Snail Pizza Automobile Umbrella Computer Storm [mo] [8o|] [^o)] [+o(] [*-)] [8-)] Coffee No Drinks [Z] Right Hug Cake Broken Heart Gift Wilted Flower Movie Dog Idea Sleep Email Travel Paradise
呢称:

加粗 斜体 下划线 链接 图片 代码 邮件地址 引用 列表

最多只能输入100个字符

Tags

SQL 数据库 asp.net C# XML 控件 .NET教程 程序 事件 数据 安全 代码 Server 客户端 验证 数据库专栏 接口 文件 Oracle DataSet 函数 DataGrid 问题 .net return C#语言 JavaScript 服务 IIS 对象 语句 windows 继承 时间 web.config 设计 开发 参数 变量 解决 字符 ADO.net 环境 VB.Net语言 web 异常 工具 服务器 计算 实例 OLEDB Application VB Word WebService insert asp net 安装 记录

精华推荐

更多

精品下载

更多