使用ASP.NET Webforms + VB / C#
我的任务是限制ASP.NET页面访问权限不属于特定角色的用户。而且我需要能够对我的解决方案进行实时测试(与可以使用模拟或伪造品的单元测试相比)。我们的网站相当复杂,因此我怀疑我仅通过单元测试就能找到所有的“陷阱”。
我在开发计算机上有东西,我敢肯定它可以在生产环境中工作:我有一个自定义的角色提供程序,已挂接到web.config文件中。我在调试网站时正在初始化和调用它,因此我可以肯定地确定它可以正常工作。我有一个仅标记了特定角色的文件夹(“管理”)。我们的角色是在我们自己的数据库中定义的,与Microsoft或Windows的角色/权限无关。
问题是:我实际上无法以希望调试的用户身份登录。我可以使用特殊的仅开发开始页面来“模拟”。对于从角色数据库构建的菜单/导航项,这行之有效,但是当然不限制页面(使用“角色提供程序”或类似功能),您仍然可以手动键入页面并将其提供。这个仅开发的起始页面将我传递的用户名设置为FormsAuthentation身份验证Cookie。
FormsAuthentication.Initialize()
FormsAuthentication.SignOut()
FormsAuthentication.SetAuthCookie(simUserName, True)
似乎当我第一次开始调试(通常在重新启动后)时,将使用与我模拟的用户名相同的用户名调用自定义角色提供程序,但过一会儿,它突然停止并且改用我的本地Windows名称。 (有Cookie的问题?)之后,它将不再起作用。
无论如何-有什么方法可以在开发期间在本地测试角色,还是我们只需要将其投入生产并希望达到最佳状态即可。
我目前不知道什么代码或设置会有用,所以请告诉我您需要什么。谢谢!
答案 0 :(得分:0)
我认为我已经找到解决问题的方法。我决定使用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)。这样,在需要使用其他角色的情况下,我总是从全新的身份验证开始。
任何想使用此解决方案的人, 警告 :您的开发启动页必须从不用于生产 >网站。同样,从不在生产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>
似乎已经解决了这个问题。
如果您有任何疑问或需要更多信息,请告诉我。