我正在开发一个ASP.NET MVC 3应用程序。
我已经实现了我用于用户身份验证和授权的自定义Principal和Identity类。我正在使用表单身份验证。
在我的所有控制器中,我使用AuthorizeAtribute
检查用户是否属于我的一个自定义角色,以根据用户的权限限制或授予对功能的访问权。
当我创建项目时,我使用了" ASP.NET MVC 3 Web应用程序" 模板,其中包含用户帐户的默认模型和控制器。
我已经为项目添加了重要功能,并对其进行了修改,以便使用根本不使用内置ASPNETDB数据库的自定义Principal和Identity类。
我的开发机器上的一切正常;但是,当我将项目部署到测试版Web服务器时,我在用户未经过身份验证并且他们尝试直接转到某个功能时遇到错误。
错误讯息为Access to the path '...\App_Data' is denied.'
。
Stack Trace如下:
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.InternalCreateDirectory(String fullPath, String path, Object dirSecurityObj, Boolean checkHost)
at System.IO.Directory.InternalCreateDirectoryHelper(String path, Boolean checkHost)
at System.IO.Directory.CreateDirectory(String path)
at System.Web.DataAccess.SqlConnectionHelper.CreateMdfFile(String fullFileName, String dataDir, String connectionString)
at System.Web.DataAccess.SqlConnectionHelper.EnsureDBFile(String connectionString)
at System.Web.DataAccess.SqlConnectionHelper.GetConnection(String connectionString, Boolean revertImpersonation)
at System.Web.Security.SqlRoleProvider.GetRolesForUser(String username)
at WebMatrix.WebData.SimpleRoleProvider.GetRolesForUser(String username)
at System.Web.Security.RolePrincipal.IsInRole(String role)
at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source, Func`2 predicate)
at System.Web.Mvc.AuthorizeAttribute.AuthorizeCore(HttpContextBase httpContext)
at System.Web.Mvc.AuthorizeAttribute.OnAuthorization(AuthorizationContext filterContext)
发生错误的原因是因为没有App_Data文件夹,也没有ASPNETDB.MDF文件,因为应用程序应该使用自定义Principal类。
当AuthorizeAtribute
尝试检查权限但自定义Principal类型未应用于当前线程因为用户不再登录时,似乎会发生此错误。
例如,如果用户在其Web浏览器中键入了URL http://theWebsite/theContoller/theRestrictedFeature/
,则Web服务器在执行控制器中<Authorize(Roles:=("Has007Access")>
功能的行theRestrictedFeature
时会崩溃。
我真的不确定如何解决这个问题,并希望就如何继续提供一些建议。
答案 0 :(得分:0)
您似乎对Principal,Identity和Roles在Asp.net中的工作方式存在一些根本性的误解。
首先,它们都没有“利用内置的ASPNETDB数据库”。这些系统的重点在于它们是基于接口的机制,不提供任何实现。您可以插入所需的任何实现。 Asp.net确实提供了一些你可以使用的实现,默认情况下有些模板配置这些实现,但它们只是提供者,可以添加或删除。
确保在添加客户提供商之前清除提供商列表。这将确保不会意外使用默认提供程序。
另外,你一定做错了。如果用户未登录,则不应检查用户角色。您必须拥有检查角色的代码,而无需先检查请求是否已获得授权。
答案 1 :(得分:0)
问题在于我使用了&#34;添加可部署的依赖关系&#34;添加&#34; Web Matrix&#34;我项目的组成部分。
当AuthorizeAttribute检查当前主体的角色时,这些组件试图在App_Data文件夹中创建ASPNETDB数据库。
关于这一点的疯狂之处在于大多数Web服务器都被权限锁定,而Web Matrix工具永远无法实现这一点。
我所要做的就是从我的项目中删除这些组件,现在一切正常。
我还必须在Web配置中清除所有成员资格,角色管理员和个人资料提供者,如下所示:
<membership>
<providers>
<clear />
</providers>
</membership>
<roleManager enabled="false">
<providers>
<clear />
</providers>
</roleManager>
<profile>
<providers>
<clear />
</providers>
</profile>
最后,我必须删除AuthorizeAttribute的所有用法。我替换了一个继承自AuthorizeAttribute的自定义类,并采取适当的步骤来确定用户是否有权通过覆盖OnAuthorization方法来访问特定功能。