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

Live testing ASP.NET custom Role Provider

使用 ASP.NET 网络表单 + VB/C#

我的任务是限制 ASP.NET 页面访问权限给不属于特定角色的用户。而且我需要能够实时测试我的解决方案(相对于我可以使用模拟或伪造的单元测试)。我们的网站相当复杂,所以我怀疑我是否能够通过单元测试找到所有 "gotchas"。

我的开发计算机上有一些我很确定可以在生产中使用的东西:我有一个自定义角色提供程序挂接到 web.config 文件中。当我调试网站时,它正在被初始化和调用,所以我有理由相信它工作正常。我有一个仅针对特定角色标记的文件夹 ("Administration")。我们的角色在我们自己的数据库中定义,与 Microsoft 或 Windows roles/permissions.

无关

问题是:我实际上无法以希望调试的用户身份登录。我可以 "simulate" 使用特殊的 development-only 起始页。这对于我们从角色数据库构建的 menu/navigation 项目来说是可行的,但当然没有限制页面(使用角色提供者或类似的东西),您仍然可以手动输入页面并将其提供。这个仅限开发的起始页将我传入的用户名设置为 FormsAuthentation 身份验证 cookie。

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

似乎当我第一次开始调试时(通常在重启后),自定义角色提供程序将使用我正在模拟的相同用户名进行调用,但过了一会儿,它突然停止并且我的本地 Windows 名称被传递。 (Cookie 问题?)之后就没用了

无论如何——有没有一种方法可以让我在开发过程中在本地测试角色,或者我们只需要将其投入生产并希望一切顺利。

我不知道此时有什么代码或设置会有用,所以让我知道您需要什么。谢谢!

我想我已经找到了解决问题的办法。我决定使用 Ch 中的一些样本。 Barry Dorrans 的 Beginning ASP.NET Security 中的第 7 个(由 Wrox 出版)希望在简单示例中使用身份验证和授权可能会导致解决方案,并且确实如此。

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

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

我还在我的开发中定义了我的模拟用户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)。这样我总是从新的身份验证开始,以防我需要使用不同的角色。

任何想要使用此解决方案的人,警告:您的开发启动页面必须永远用于 Production 网站。同样,从不 在作品 web.config 中使用用户名和密码。这 ONLY 用于调试和测试。根据您对开发和生产代码进行版本控制的方式,您可能必须手动合并从开发到生产的某些更改,以避免将此调试代码发送到生产。

我还了解到 Microsoft 希望我们使用 Membership Provider 代替 FormsAuthentication class。在生产代码中,我们应该。但就我的目的而言(确保我可以在调试时以不同 users/roles 与网站交互),这似乎是最简单的解决方案。

EDIT -- 另一个难题:我的自定义角色提供程序中仍然收到奇怪的方法调用。几次使用我在登录页面上登录的用户名调用一个方法(这是我所期望的);大多数情况下,是我的 Windows 用户名让我相信 Windows 授权仍在被 ASP.NET 某处 使用。经过更多研究(感谢 SO!!!),我在项目的 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>

似乎已经解决了这个问题。

如果您有任何疑问,或需要更多信息,请告诉我。