Пользовательский членство, проверяющее успешность, но не способное GetUser () - PullRequest
2 голосов
/ 12 августа 2011

Здравствуйте, пользователи Stackoverflow,

В настоящее время я немного погружаюсь в WCF и сейчас настраиваю POC-веб-сервис, который использует clientCredentialType = "UserName". Так как у нас есть некоторые уникальные пожелания, мы выбрали нестандартный член сообщества. В настоящее время я реализую по частям. Это означает, что большинство методов (которые еще не используются) генерируют не реализованные исключения.

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

Пока все хорошо.

Однако когда я вызываю метод GetUser () (который извлекает имя пользователя откуда-то и затем вызывает):

public override MembershipUser GetUser(string username, bool userIsOnline)
{
    throw new NotImplementedException();
}

Как вы можете видеть, это не реализовано (поэтому очевидно, что оно не работает), что разочаровывает меня на данный момент, это то, что я не могу заставить это работать, потому что имя пользователя, которое передается из нижележащего GetUser () Метод (из базового класса MembershipProvider) передает пустую строку.

Есть что-то конкретное, что я забыл? Кто-нибудь еще имел опыт работы с пользовательским memberhipprovider, который занимался этой проблемой?

Редактировать: добавлен стек вызовов

at System.Web.Security.Membership.GetUser (Строковое имя пользователя, логическое значение userIsOnline) в System.Web.Security.Membership.GetUser () в DirectPay.WCF.Services.Service.TestConnection () в D: \ Projects \ IBS проекты \ DirectPay \ source \ WCF.Services \ Service.svc.cs: строка 21 в SyncInvokeTestConnection (Object, Object [], Object []) в System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke (Объект экземпляр, Object [] входы, Object [] и выходы) в System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin (MessageRpc & RPC)

Ответы [ 2 ]

0 голосов
/ 12 августа 2011

Что ж, мой текущий ответ после того, как я несколько часов бью головой об стену (скорее всего потому, что я еще не знаю, что такое WCF ^^) обнаружил, что вы можете получить текущего пользователя с помощью:

ServiceSecurityContext.Current.PrimaryIdentity.Name;

Метод GetUser (), к сожалению, по-прежнему не соответствует тому, что я хотел бы, обойти это можно было бы переопределить этот метод в моем настраиваемом членском члене и получить имя там. Другой вариант - добавить в метод GetUser (string username, bool userIsOnline) следующее:

if(string.IsNullOrWhiteSpace(username))
{
   username = ServiceSecurityContext.Current.PrimaryIdentity.Name;
}

Мне бы очень хотелось найти способ без необходимости извлекать имя пользователя вручную, поэтому я не буду помечать это как ваш ответ, во всяком случае, это обходной путь.

0 голосов
/ 12 августа 2011

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

/// <summary>
/// Gets information from the data source for a user.
/// Provides an option to update the last-activity date/time stamp for the user.
/// </summary>
/// <param name="username">The name of the user to get information for.</param>
/// <param name="userIsOnline">true to update the last-activity date/time 
/// stamp for the user; false to return user information without updating 
/// the last-activity date/time stamp for the user.</param>
/// <returns>A MembershipUser object populated with the specified
/// user's information from the data source.</returns>
public override MembershipUser GetUser(string username, bool userIsOnline)
{
    // Get User from my custom database
    User user = Database.User.GetUser(username);

    // Convert User to MebmershipUser (or return null if User == null)
    return user == null ? null : new MembershipUser(
        "CustomMembershipProvider",
        user.UserName, 
        user.UserID,
        user.Email,
        string.Empty, 
        user.Comments, 
        user.Active,
        false, 
        user.CreatedDate, 
        user.LastLoginDate, 
        DateTime.Now, 
        user.LastPasswordChangedDate, 
        DateTime.Now);
}
...