2015-04-24 5 views
0

Мне нужна помощь с веб-службами ASMX.Обычная проверка подлинности на удаленном сервере

Предположим, у меня есть ServerService, который предоставляет некоторые данные. Предположим, что у него есть метод GetRandomInteger, который возвращает случайное целое число (очевидно). Он реализует обычную базовую аутентификацию с использованием IHttpModule.

public class BasicAuthHttpModule : IHttpModule 
{ 
    private UserRepository _userRepository; 

    public void Dispose() 
    { 
    } 

    public void Init(HttpApplication application) 
    { 
     _userRepository = new UserRepository(); 
     application.AuthenticateRequest += OnAuthenticateRequest; 
     application.EndRequest += OnEndRequest; 
    } 

    public void OnAuthenticateRequest(object source, EventArgs e) 
    { 
     var app = (HttpApplication)source; 

     string authHeader = app.Request.Headers["Authorization"]; 
     if (!string.IsNullOrEmpty(authHeader)) 
     { 
      // Here I successfully get credentials from header 

      if (_userRepository.ValidateUser(username, password)) return; 

      // Return 401 and CompleteRequest 
     } 
     else 
     { 
      // Return 401 and End 
     } 
    } 

    public void OnEndRequest(object source, EventArgs eventArgs) 
    { 
     if (HttpContext.Current.Response.StatusCode == 401) 
     { 
       // Return 401 and require new authorization 
     } 
    } 

К счастью, он работает. Теперь я могу успешно открыть файл Service.asmx, получить базовое окно проверки подлинности и получить доступ к его методу GetRandomInteger после успешной аутентификации.

Теперь у меня есть приложение ASP.NET MVC 4 с именем ClientService. Он должен обеспечивать пользовательский интерфейс удобным и соответствующим доступом к методам ServerService. Теперь он имеет контроллеры по умолчанию, как счета и дома, представления по умолчанию и т.д.

  1. Мне нужна эта ClientService для проверки подлинности на ServerService. Я имею в виду, что будет страница Home/Index с кнопкой «Login». Я ввожу логин и пароль, и ClientService пытается выполнить аутентификацию в ServerService. Он возвращает ошибку при сбое или аутентифицируется при успешном доступе к какой-либо странице Home/RandomInt, на которой будет показано целое число, запрошенное из ServerService. Каков наилучший и самый простой способ сделать это?

  2. Как реализовать регистрацию на сервере ServerService? В ASMX нет атрибута AllowAnonymous или чего-то другого, поэтому я не могу зарегистрировать пользователя, потому что у него нет доступа к каким-либо из методов из-за ошибки 401.

Заранее спасибо.

P.S. Нет. Я не могу использовать WCF или что-то еще. Мне нужно внедрить веб-сервис ASMX.

Update 1: ОК, я узнал что-то новое здесь

http://www.aspsnippets.com/Articles/How-to-add-reference-of-Web-Service-ASMX-in-ASPNet-using-Visual-Studio.aspx

Существует старый стиль вещь, как «Веб-ссылки», и это не является «справочная служба». Я добавил этот веб-ссылку на мой проект, и теперь я могу назвать некоторые методы из этой ASMX страницы таким образом:

 try 
     { 
      ServerService svc = new ServerService(); 
      svc.Credentials = new NetworkCredential("user", "password"); 
      int a = svc.GetRandomInteger(); 
     } catch (WebException e) { 
      // Auth failed 
     } 

Однако, я не понимаю, как связать его с проверкой подлинности ASP.NET MVC ClientService. Таким образом, оба вопроса остаются открытыми. Надеюсь, я пойму это или вы мне поможете.

ответ

1

Вот документация для добавления веб-ссылки на службу ASMX.

http://www.aspsnippets.com/Articles/How-to-add-reference-of-Web-Service-ASMX-in-ASPNet-using-Visual-Studio.aspx

Используя эту информацию, можно легко сделать запросы к веб-службе.

Единственное, что я оставил сделать в момент обновления вопроса, - это создать пользовательскую аутентификацию.

  1. При входе пользователя в систему клиент отправляет запрос службе.В случае успешной базовой проверки подлинности он создает правильный бланк cookie FormsAuthentication для пользователя. Пользователь регистрируется.

  2. При каждом запросе службе клиент извлекает логин из файла cookie FormsAuthentication и его пароль из кеша сервера и использует их для аутентификации в службе. В случае основной ошибки аутентификации (это может произойти только в том случае, если пароль пользователя был изменен на стороне службы), cookie очищается и сеанс прерывается.

  3. Регистрация осуществляется с использованием другой службы ASMX, которая не использует базовый auth, но анонимна (поскольку регистрация должна быть анонимным методом).

Всё. Наконец, я нашел правильное решение :)