MVC 4.5 自定义角色提供程序错误(找不到默认提供程序)
本文关键字:程序 找不到 默认 错误 角色 MVC 自定义 | 更新日期: 2023-09-27 18:37:07
我在尝试实现自定义角色提供程序时感到非常沮丧。 我挂断了"找不到默认角色提供程序"错误消息。 这是我的web.config:
<?xml version="1.0" encoding="utf-8"?>
<!--
For more information on how to configure your ASP.NET application, please visit
http://go.microsoft.com/fwlink/?LinkId=169433
-->
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<appSettings>
<add key="webpages:Version" value="2.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="PreserveLoginUrl" value="true" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>
<system.web>
<httpRuntime targetFramework="4.5" />
<compilation debug="true" targetFramework="4.5">
<assemblies>
<add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</assemblies>
</compilation>
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="900" />
</authentication>
<roleManager enabled="true" defaultProvider="AccountRoleProvider">
<providers>
<clear/>
<add name="AccountRoleProvider"
type="Billing.Business.AccountRoleProvider, Billing"
enablePasswordRetrieval="false" enablePasswordReset="true"
requiresQuestionAndAnswer="false" writeExceptionsToEventLog="false" />
</providers>
</roleManager>
<pages>
<namespaces>
<add namespace="System.Web.Helpers" />
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="System.Web.WebPages" />
<add namespace="System.Web.Optimization" />
</namespaces>
</pages>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<handlers>
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%'Microsoft.NET'Framework'v4.0.30319'aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%'Microsoft.NET'Framework64'v4.0.30319'aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
</configuration>
下面是自定义 RoleProvider 类的代码:
namespace Billing.Business
{
public class AccountRoleProvider : RoleProvider
{
...
public override string[] GetRolesForUser(string username)
{
List<string> userRoles = new List<string>();
var entities = new CRSCommonEntities();
short role = entities.CrsAppUsers.First(u => u.UserName == username).UserType;
if (role >= (short)UserRole.ADMIN)
{
userRoles.Add(UserRole.ADMIN.ToString());
}
if (role >= (short)UserRole.STAFF)
{
userRoles.Add(UserRole.STAFF.ToString());
}
if (role >= (short)UserRole.CHAIN)
{
userRoles.Add(UserRole.CHAIN.ToString());
}
if (role >= (short)UserRole.PROPERTY)
{
userRoles.Add(UserRole.PROPERTY.ToString());
}
return userRoles.ToArray();
}
/// <summary>
/// This returns true if the user has an access level at or above the request level
/// </summary>
/// <param name="username"></param>
/// <param name="roleName"></param>
/// <returns></returns>
public override bool IsUserInRole(string username, string roleName)
{
var entities = new CRSCommonEntities();
var user = entities.AppUsers.Single(u => u.UserName == username);
return user.UserType >= (short)Enum.Parse(typeof(UserRole), roleName);
}
...
}
}
如果你们能帮我发现我做错了什么,我只是没有看到它,我已经开始了两天了。 谢谢!
我终于想通了。 提供程序的名称重写必须与 web.config 中设置的名称相同。 我只需要将获取返回值更改为"帐户角色提供程序"即可!
type="Billing.Business.AccountRoleProvider, Billing"
提供程序所在的程序集是否称为Billing
?您的程序集很可能被称为更多的东西。
如果它实际上称为 Billing
,请确保保存Web.config
的程序集具有对 Billing
的引用。