Как я могу с помощью форм аутентифицировать пользователя в настраиваемом веб-сервисе?

Я работаю над интеграцией сайта silverlight в наше существующее приложение и пытаюсь заставить работать функцию входа в систему. У приложения Silverlight должна быть собственная страница входа в систему, а вход в систему должен использовать существующую проверку подлинности форм ASP.NET. В рамках процедуры входа в систему мы вызываем некоторый внешний код, поэтому использование скриптовых методов, которые предоставляет System.Web.ApplicationServices.AuthenticationService, не является вариантом. Я попытался использовать для этого FormsAuthentication.Authenticate, но это не сработало. Есть ли у кого-нибудь идеи, как это обойти?


person Jeffrey Lott    schedule 06.07.2009    source источник
comment
Где именно здесь находится веб-сервис?   -  person John Saunders    schedule 07.07.2009
comment
Это очень похоже на дубликат: stackoverflow.com/questions/890310/   -  person John Saunders    schedule 07.07.2009
comment
Проблема аналогична, но я не могу использовать эти решения, потому что мне нужно сделать внешний вызов, прежде чем я смогу войти в систему.   -  person Jeffrey Lott    schedule 07.07.2009


Ответы (2)


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

Я сделал это, например, я создал службу WCF со следующим интерфейсом, на который ссылается мой клиент Silverlight:

[ServiceContract]
    public interface IAuthenticationService
    {
        [OperationContract()]
        string Login(string username, string password, bool isPersistent);
        [OperationContract()]
        bool Logout();
        [OperationContract()]
        string IsLoggedIn();     
    }

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

try
            {
                //Call you external code here
                //Then use the membership provider to authenticate
                if (Membership.ValidateUser(username, password))
                {

                    FormsAuthentication.SetAuthCookie(username, isPersistent);

                }
            }
            catch (Exception ex)
            {
                Logging.LogException("Error in Login", ex);
            }

Также вам не нужно включать следующий атрибут над определением класса в вашу реализацию службы, чтобы включить asp.net compat, что даст вам доступ к HttpContext:

 [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
person Andy Britcliffe    schedule 07.07.2009

Решение простое. Просто создайте настраиваемого поставщика членства, который вызывает ваш настраиваемый код. Дополнительную информацию см. В этой статье о библиотеке MSDN. Полные образцы также доступны на 15 секунд и обзорное видео на веб-сайте ASP.NET. Наконец, похоже, что Microsoft выпустила исходный код для встроенный поставщик членства

person Michael Brown    schedule 07.07.2009