0

我正在开发一个 ASP.NET MVC 3 应用程序。

我已经实现了用于用户身份验证和授权的自定义 Principal 和 Identity 类。我正在使用表单身份验证。

在我的所有控制器中,我使用AuthorizeAtribute来检查用户是否处于我的自定义角色之一,以根据用户的权限限制或授予对功能的访问权限。

当我创建项目时,我使用了“ASP.NET MVC 3 Web 应用程序”模板,其中包括用户帐户的默认模型和控制器。

我为项目添加了重要的功能,并对其进行了修改,以使用完全不使用内置 ASPNETDB 数据库的自定义 Principal 和 Identity 类。

在我的开发机器上一切正常;但是,当我将项目部署到 beta Web 服务器时,当用户未通过身份验证并且他们尝试直接访问某个功能时,我遇到了错误。

错误消息是Access to the path '...\App_Data' is denied.'

堆栈跟踪如下:

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因为用户不再登录。

例如,如果用户在他们的 Web 浏览器中键入 URL,则 Web 服务器在执行我的控制器中的函数http://theWebsite/theContoller/theRestrictedFeature/行时会崩溃。<Authorize(Roles:=("Has007Access")>theRestrictedFeature

我真的不知道如何解决这个问题,并希望得到一些关于如何进行的建议。

4

2 回答 2

0

您似乎对主体、身份和角色在 Asp.net 中的工作方式有一些基本的误解。

首先,它们都没有“利用内置的 ASPNETDB 数据库”。这些系统的全部意义在于它们是基于接口的机制,不提供任何实现。你可以插入任何你想要的实现。Asp.net 确实提供了几种您可以使用的实现,并且一些模板默认配置这些实现,但它们只是提供者,可以添加或删除。

请确保在添加客户提供商之前清除您的提供商列表。这将确保不会意外使用默认提供程序。

另外,你一定做错了什么。如果用户未登录,则不应检查用户角色。您必须拥有检查角色的代码,而无需先检查请求是否被授权。

于 2014-05-07T16:25:34.440 回答
0

问题是我使用了“添加可部署依赖项”工具,该工具将“Web Matrix”组件添加到我的项目中。

当 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 方法访问特定功能。

于 2014-05-08T19:09:56.200 回答