Могу ли я создать собственный поставщик ролей через службу WCF? - PullRequest
3 голосов
/ 17 мая 2010

У меня есть веб-приложение, которое обращается к базе данных через службу wcf. Идея состоит в том, чтобы абстрагировать данные из веб-приложения с помощью сервиса wcf. Все это прекрасно работает, но я также использую встроенный ролевой провайдер с помощью SqlRoleManager, который напрямую обращается к базе данных aspnetdb. Я хотел бы абстрагировать ролевой провайдер, создав собственный ролевый провайдер в сервисе wcf и затем получив доступ к нему через сервис wcf.

Я создал пользовательский поставщик ролей, и он отлично работает, но теперь мне нужно поместить его в службу wcf.

Поэтому, прежде чем я безрассудно пытался заставить это работать через службу WCF, я создал второй класс в веб-приложении, который получил доступ к классу roleprovider, и изменил параметры моей конфигурации configprovider для использования этого класса. Итак, мой класс roleprovider называется «UcfCstRoleProvider», а мой web.config выглядит следующим образом:

    <roleManager 
    enabled="true" 
    defaultProvider="UcfCstRoleProvider">
  <providers>
    <add 
        name="UcfCstRoleProvider" 
        type="Ucf.Security.Wcf.WebTests.UcfCstRoleProvider, Ucf.Security.Wcf.WebTests" 
        connectionStringName="SqlRoleManagerConnection" 
        applicationName="SMTP" />
  </providers>
</roleManager>

Мой класс начинается так:

    public class UcfCstRoleProvider : RoleProvider
{
    private readonly WindowsTokenRoleProvider _roleProxy = new WindowsTokenRoleProvider();

    public override string ApplicationName
    {
        get
        {
            return _roleProxy.ApplicationName;
        }
        set
        {
            _roleProxy.ApplicationName = value;
        }
    }

Как я уже сказал, это прекрасно работает. Таким образом, второй класс называется BlRoleProvider, который имеет свойства и параметры, идентичные роли roleprovide, но не реализует RoleProvider. Я изменил web.config так, чтобы он указывал на этот класс следующим образом:

    <roleManager 
    enabled="true" 
    defaultProvider="BlRoleProvider">
  <providers>
    <add 
        name="UcfCstRoleProvider" 
        type="Ucf.Security.Wcf.WebTests.BlRoleProvider, Ucf.Security.Wcf.WebTests" 
        connectionStringName="SqlRoleManagerConnection" 
        applicationName="SMTP" />
  </providers>
</roleManager>

Но я получаю эту ошибку. «Поставщик должен реализовать класс« System.Web.Security.RoleProvider »."

Надеюсь, я объяснил достаточно хорошо, чтобы показать, что я пытаюсь сделать. Если я смогу заставить ролевого провайдера работать через другой класс в том же приложении, я уверен, что он будет работать через службу WCF, но как мне преодолеть эту ошибку?

Или, может быть, я ошибся и есть лучший способ сделать то, что я хочу сделать?

Ответы [ 3 ]

4 голосов
/ 28 июня 2010

Я думаю, что вам лучше всего создать собственного поставщика ролей и внедрить каждый метод. В реализации каждого метода вызовите службу WCF для доступа к данным. Например:

public class WcfRoleProvider: RoleProvider
{
    public bool IsUserInRole(string username, roleName)
    {
        bool result = false;
        using(WcfRoleService roleService = new WcfRoleService())
        {
            result = roleService.IsUserInRole(username, roleName);
        }

        return result;
     }
}
0 голосов
/ 18 мая 2010

Глядя на ваш код, вы обнаруживаете, что у вас уже есть конфигурация с использованием поставщика пользовательских ролей.

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

В WCF все работает немного по-другому, у вас нет доступа к состояниям сеанса и приложения, поскольку каждый вызов считается состоянием без сохранения состояния, однако настраиваемый заголовок будет компенсировать это, обрабатывая эти вещи по мере выполнения вызова.

0 голосов
/ 17 мая 2010

Нет, у вас должен быть класс, который должен реализовывать RoleProvider. Это не будет работать. Если вы не можете напрямую наследовать этот класс от RoleProvider, рассмотрите возможность создания класса-оболочки RoleProvider, который реализует методы / методы RoleProvider, но использует все, что вам нужно сделать с этим вторым классом.

Эта ошибка относится не только к WCF, но и к структуре поставщика ролей.

НТН.

...