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!

有帮助吗?

解决方案

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!

其他提示

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.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top