Reputation: 103
I am thoroughly frustrated trying to implement a custom RoleProvider. I am hung up on the "Default Role Provider could not be found." error message. Here is my 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>
And here is the code for the custom RoleProvider class:
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);
}
...
}
}
If you guys could help me spot what I am doing wrong I am just not seeing it and I have been starting at this for two days now. Thanks!
Upvotes: 2
Views: 2038
Reputation: 103
I FINALLY figured it out. The name override for the provider has to be the same as the name set in the web.config. I just had to change the get return value to "AccountRoleProvider" and it works!
Upvotes: 1
Reputation: 34822
type="Billing.Business.AccountRoleProvider, Billing"
Is your assembly that the provider is located within called Billing
? It's likely that your assembly is called something more.
If it is in fact called Billing
, ensure that the assembly which holds your Web.config
has a reference to Billing
.
Upvotes: 0