Проблема с пользовательским поставщиком ролей - PullRequest
2 голосов
/ 10 декабря 2010

Эта трассировка стека возникает в результате ошибки, которая гласит: «Имя поставщика не может быть пустым или пустым.»

[ArgumentException: Имя поставщика не может быть пустым или пустым.] System.Web.Security.Roles.Initialize () +2230205 System.Web.Security.RoleManagerModule.OnLeave (Источник объекта, EventArgs eventArgs) +68 System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () +148p.(IExecutionStep step, Boolean & completeSynchronously) + 75

По сути, я создаю свой собственный пользовательский поставщик ролей, который наследует класс SqlRoleProvider, я успешно вызываю инициализацию и подтвердил, что он успешно выполняет все в моем коде, но что-то в.Net явно не инициализируется правильно, поскольку объект «Роли», который я не могу унаследовать, вызывает у меня некоторые головные боли ...

есть идеи?

Хорошо, мое решение является многоуровневым, что означаетМне нужно обеспечить безопасность через уровень бизнес-объектов тоже ... для того, чтобыдля этого я определяю следующее:

--- EDIT 1 ---

Мой код:

В основной сборке:

public class C20RoleProvider : RoleProvider
{
     private C20SqlRoleDataProvider prov;

     C20RoleProvider()
     {
         // this code is actually using some reflection based on config files
         // i have simplified this to illustrate the problem im having ...
         prov = new C20SqlRoleDataProvider();
     }

     public override void Initialize(string name, NameValueCollection config)
     {
         prov.Initialize(name, config);
     }
}

Inсборка провайдера:

public class C20SqlRoleDataProvider : SqlRoleProvider
{
      // code omitted
}

На данный момент я ожидал бы, что смогу использовать все, что определяет базовый класс "RoleProvider", делая вызовы на prov....

Я пропустил дополнительный код, но в основном есть все методы, помеченные как абстрактные из класса RoleProvider в классе "C20RoleProvider".

Я знаю, что это выглядит немного странноно то, что я хочу сделать, это отделить бизнес-логику от сбора данных в провайдере, причем провайдер данных является чем-то (через мой код отражения), класс бизнес-логики «C20RoleProvider» можно использовать в бизнес-среде, не опасаясь что-либо сломать, идля замены внутренних источников (например, данные ролей могут поступать откуда угодно).

Здесь происходит гораздо больше, но, по сути, весь уровень инфраструктуры приложений / бизнес-объектов использует поставщиков таким образом, чтобы «предоставлять» данные ядру.бизнес логика из любого источника.

1 Ответ

7 голосов
/ 17 декабря 2010

Хорошо, я немного покопался ... оказалось, что я не передавал обратно это свойство "Name", которое фактически нигде не упоминается ...

Исправление происходит примерно так ...

public class C20RoleProvider : RoleProvider 
{ 
     private C20SqlRoleDataProvider prov; 

     public string Name
     {
         get {return prov.Name;}
     }

     C20RoleProvider() 
     { 
         // this code is actually using some reflection based on config files 
         // i have simplified this to illustrate the problem im having ... 
         prov = new C20SqlRoleDataProvider(); 
     } 

     public override void Initialize(string name, NameValueCollection config) 
     { 
         prov.Initialize(name, config); 
     } 
} 

Странно, что это, кажется, не известно нигде в сети.

...