Аутентификация WCF с использованием поставщика членства SQL - PullRequest
3 голосов
/ 10 августа 2010

Надеюсь, вы, ребята, сможете прояснить кое-что для меня.У меня есть веб-приложение, использующее Sql Membership Provider, и оно общается со вторым веб-приложением через службу WCF.Оба приложения используют одно и то же хранилище данных Sql Membership Provider ... но мне нужен каждый вызов службы WCF для проверки подлинности пользователя.

Теперь я посмотрел МНОГО примеров, но я чувствую себя как примерыЯ видел, как либо пропущен определенный код, потому что он «должен» быть очевидным для меня, либо я неправильно понимаю, как WCF обрабатывает запрос (см. ожидаемый код ниже).

Я благодарен за любую помощь ...

ЗДЕСЬ, ЧТО Я УЖЕ ЗНАЮ, КАК ДЕЛАТЬ

  1. Я знаю, как настроить членство в Sql на обоих концах.
  2. Я знаю, какнастроить wsHttpBinding
  3. Я знаю, как настроить сертификат служб, используемый в транспортной безопасности

ЗДЕСЬ, ЧТО Я ВКЛЮЧЕН В

Как я могу передать пароль участника (... вы не можете) Передать ли файл cookie аутентификации?Если да, то как? Могу ли я создать «известное» имя пользователя и пароль, не относящиеся к пользователю (самим себе)?

В ВЕБ-КЛИЕНТЕ, К КОТОРОМУ Я БУДУ ОЖИДАТЬСМОТРИТЕ ЧЕМ-то, КАК ЭТОТ

protected void btnLogin_Click(object sender, EventArgs e)
{
    // Logging into the web-application is known and easy.
    if (Membership.ValidateUser("MyUserName", "MyPassword"))
    {
        FormsAuthentication.SetAuthCookie("MyUserName", true);
        FormsAuthentication.RedirectFromLoginPage("MyUserName", false);
    }
}

protected ServiceReference1.Contractor getContractor(Int32 key)
{
    // I expect something "like" this on the client call.
    MembershipUser user = Membership.GetUser("MyUserName");

    ServiceReference1.FishDataClient wcfService = new ServiceReference1.FishDataClient();

    // You can't retreive the users password directly,
    // nor can you get the hash from the SqlMembershipProvider.
    wcfService.ChannelFactory.Credentials.UserName.UserName = user.UserName;
    // So doing something like this would not be possible.
    wcfService.ChannelFactory.Credentials.UserName.Password = "??????";

    // So how is the web service going to authenticate the user from it's
    // references to the same SqlMembershipProvider (database).
    ServiceReference1.Contractor contractor = wcfService.GetContractor(key);

    wcfService.Close();
    wcfService = null;

    return contractor;
}

В СЛУЖБЕ WCF Я БУДУ ОЖИДАТЬ, ЧТО-ТО СМОТРЕТЬ КОД, КАК ЭТО

[PrincipalPermission(SecurityAction.Demand, Role = "User")]
public Contractor GetContractor(Int32 key)
{
    ServiceSecurityContext context = ServiceSecurityContext.Current;
    Contractor contractor = new Contractor();

    // What goes here?  I would expect something like this...
    if (Membership.ValidateUser("???????", "???????"))
        contractor.Get(key);

    return contractor;
}

Ответы [ 2 ]

1 голос
/ 10 августа 2010

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

В этом случае вы захотите поделиться файлами cookie аутентификации между приложениями.Вы можете найти более подробную информацию о том, как это сделать здесь .

Затем вам нужно передать куки-файл аутентификации, пришедший с запросом веб-приложения, в вызов службы WCF.Вы можете увидеть, как это сделать здесь .

Идея состоит в том, что пользователь входит в ваше веб-приложение и тем самым входит в вашу службу WCF.

0 голосов
/ 04 марта 2011

Взгляните на «Web to Remote WCF Using Transport Security (Trusted Subsystem, HTTP)» по ссылкам ниже, я уверен, что вы можете найти ответ там.Существует также следующий код, который, я полагаю, может помочь:

app.Context.User = new GenericPrincipal(new
       GenericIdentity(username, "Membership Provider"), roles);

также:

NetworkCredential netCred = new NetworkCredential("username", " p@ssw0rd");
asmxwebservice.Service proxy = new asmxwebservice.Service();
proxy.Credentials = netCred;               
proxy.GetData(21, true);

В противном случае я бы рекомендовал вернуться к основам, поэтому убедитесь, что вы получаете ожидаемую аутентификацию и авторизациюнастроить работу на 100% при использовании поставщиков членства и ролей в клиенте asp (приложение asp.net).

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

Я еще не пробовал аутентификации форм, но недавно достиг реализации аутентификации Windows из приложения ASP.NET, вызывающего службы WCF, размещенные в IIS, и у меня естьобнаружил, что небольшая ошибка в файле конфигурации (привязки) может привести к разрыву приложения.

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

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

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...