代码之家  ›  专栏  ›  技术社区  ›  RandyB

实时测试ASP.NET自定义角色提供程序

  •  0
  • RandyB  · 技术社区  · 6 年前

    我的任务是限制非特定角色的用户访问ASP.NET页面。我需要能够对我的解决方案进行现场测试(而不是单元测试,在单元测试中我可以使用mock或fake)。我们的网站相当复杂,所以我怀疑仅仅通过单元测试是否能找到所有的“陷阱”。

    我的开发计算机上有一些东西,我很确定可以在生产中使用:我有一个自定义角色提供程序挂接到web.config文件中。当我调试网站时,它正在被初始化和调用,所以我很确定它工作正常。我有一个文件夹(“管理”)只标记为一个特定的角色。我们的角色是在我们自己的数据库中定义的,不受Microsoft或Windows角色/权限的限制。

    仅限开发 起始页。对于从角色数据库构建的菜单/导航项来说,这是可行的,但是在不限制页面(使用角色提供程序或类似的东西)的情况下,您仍然可以手动键入一个页面,它将被提供。此仅适用于开发的起始页设置我作为FormsAuthention cookie传入的用户名。

    FormsAuthentication.Initialize()
    FormsAuthentication.SignOut()
    FormsAuthentication.SetAuthCookie(simUserName, True)
    

    似乎当我第一次开始调试时(通常是在重新启动之后),自定义角色提供程序将使用我正在模拟的相同用户名被调用,但过了一段时间,该过程突然停止,而我的本地Windows名称将被传递(饼干问题?)。

    不管怎样--有没有一种方法可以在开发过程中在本地测试角色,或者我们只需要将此应用到生产中,并希望达到最佳效果。

    1 回复  |  直到 6 年前
        1
  •  0
  •   RandyB    6 年前

    我想我已经找到了解决问题的办法。我决定在第七章中用一些样品 开始ASP.NET安全性

    使用表单身份验证的一个例子(第155-157页)显示了一个简单的login.aspx页面,类似于我的开发启动页面。我在开发启动页中的代码(如上所示)不正确。应该是:

    FormsAuthentication.Authenticate(simUserName, simUserPassword)
    FormsAuthentication.RedirectFromLoginPage(simUserName, False)
    

    我还在Development web.config中定义了模拟用户:

    <authentication mode="Forms">
      <forms defaultUrl="default.aspx" loginUrl="mystart.aspx">
        <credentials passwordFormat="Clear">
          <user name="GeorgeWashington" password="password"/>
          <user name="AndrewJackson" password="password"/>
          <user name="AbrahamLincoln" password="password"/>
          <user name="TeddyRoosevelt" password="password"/>
          <user name="JackKennedy" password="password"/>
        </credentials>
      </forms>
    </authentication>
    

    当调用FormsAuthentication.Authenticate并对我选择的任何一个模拟用户进行身份验证时,它似乎会导致ASP.NET在调用角色提供程序时始终使用此用户名。至少,在调试网站时,这似乎是可行的。

    我已经将项目设置为始终调用我的开发启动页(登录页——mystart.aspx)。这样,我总是从一个新的身份验证开始,以防我需要使用不同的角色。

    警告 从未 用于 从未 在生产web.config中使用用户名和密码。这是 用于调试和测试。根据版本控制开发和生产代码的方式,您可能必须手动合并从开发到生产的某些更改,以避免将此调试代码发送到生产。

    编辑 --还有一个难题:我的自定义角色提供程序中仍有奇怪的方法调用。有几次,一个方法会用我在我的登录页面上登录的用户名调用(这是我所期望的);通常是我的Windows用户名让我相信ASP.NET仍在使用Windows授权 . 经过更多的研究(谢谢!!!),我在我的项目的applicationhost.config文件中发现,Windows身份验证设置为True,我猜这会导致与我的web.config文件冲突。将applicationhost.config中的值设置为:

    <location path="MyWebSite">
        <system.webServer>
            <security>
                <authentication>
                    <anonymousAuthentication enabled="true" />
                    <windowsAuthentication enabled="false" />
                </authentication>
            </security>
        </system.webServer>
    </location>