繁体   English   中英

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

[英]Live testing ASP.NET custom Role Provider

使用ASP.NET Webforms + VB / C#

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

我肯定在开发计算机上有东西,我肯定可以在生产环境中使用:我有一个自定义的角色提供程序,已连接到web.config文件中。 我在调试网站时正在初始化和调用它,因此我可以肯定地确定它可以正常工作。 我有一个仅标记了特定角色的文件夹(“管理”)。 我们的角色是在我们自己的数据库中定义的,与Microsoft或Windows的角色/权限无关。

问题是:我实际上无法以要调试的用户身份登录。 我可以使用特殊的仅用于开发的起始页来“模拟”此操作。 对于从角色数据库构建的菜单/导航项,这行之有效,但是当然不限制页面(使用“角色提供程序”或类似功能),您仍然可以手动键入页面并将其提供。 这个仅开发的起始页面将我传递的用户名设置为FormsAuthentation身份验证cookie。

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

好像当我第一次开始调试时(通常是在重新启动后),将使用与我模拟的用户名相同的用户名调用自定义角色提供程序,但过一会儿,该程序突然停止并且改用了我的本地Windows名称。 (Cookie问题?)之后,它不再起作用。

无论如何-有没有一种方法可以在开发过程中本地测试角色,还是只需要将其投入生产并希望达到最佳状态。

我目前不知道哪些代码或设置会有用,所以请告诉我您需要什么。 谢谢!

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

使用表单身份验证的示例之一(第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中使用用户名和密码。 用于调试和测试。 根据版本控制开发和生产代码的方式,可能必须手动合并从开发到生产的某些更改,以避免将此调试代码发送到生产。

我也了解Microsoft希望我们使用Membership Provider代替FormsAuthentication类。 在生产代码中,我们应该这样做。 但是出于我的目的(确保在调试时可以与不同的用户/角色进行网站交互),这似乎是最简单的解决方案。

编辑 -还有一个难题:我的自定义角色提供程序中仍然收到奇怪的方法调用。 几次会使用我在登录页面上登录时使用的用户名调用方法(这是我所期望的); 经常是我的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>

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM