Ошибка поставщика пользовательских ролей MVC 4.5 (не удалось найти defaultProvider)

Я полностью разочарован, пытаясь реализовать собственный RoleProvider. Я зациклился на «Не удалось найти поставщика ролей по умолчанию». сообщение об ошибке. Вот мой 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);
        }

        ...
    }
}

Если бы вы, ребята, могли помочь мне определить, что я делаю неправильно, я просто этого не вижу, и я начинаю это уже два дня. Спасибо!


person Deus Duke    schedule 26.10.2013    source источник


Ответы (2)


Я наконец-то понял. Переопределение имени для провайдера должно совпадать с именем, установленным в файле web.config. Мне просто нужно было изменить возвращаемое значение на «AccountRoleProvider», и это сработало!

person Deus Duke    schedule 29.10.2013

type="Billing.Business.AccountRoleProvider, Billing"

Ваша сборка, в которой находится провайдер, называется Billing? Вполне вероятно, что ваша сборка называется как-то иначе.

Если он на самом деле называется Billing, убедитесь, что сборка, содержащая ваш Web.config, имеет ссылку на Billing.

person Haney    schedule 26.10.2013
comment
Здравствуйте и спасибо за ваш ответ. Сборка называется Billing, а web.config и провайдер находятся в одном приложении. - person Deus Duke; 28.10.2013