2010-02-16 4 views
4

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

Мне было интересно, что я должен сделать, чтобы защитить мой веб-сервис? Примеры были бы замечательными.

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

bool loginSuccessFull = false; 

/// knooppunt 
string loginID = ConfigurationManager.AppSettings["WebServiceLogin"]; 
string password = ConfigurationManager.AppSettings["WebServicePass"]; 


//A. The m_SecurityService object is created and initialised 
Security securityService = new Security(); 
securityService.CookieContainer = new System.Net.CookieContainer(); 


string challenge = securityService.InitializeLogin(loginID); 
string pwd = password; 
string response = pwd + challenge; 


System.Security.Cryptography.SHA1CryptoServiceProvider SHA1 = new System.Security.Cryptography.SHA1CryptoServiceProvider(); 
SHA1.Initialize(); 
byte[] hash = SHA1.ComputeHash(System.Text.Encoding.Default.GetBytes(response)); 

System.Text.StringBuilder builder = new System.Text.StringBuilder(); 
foreach (byte b in hash) 
    builder.Append(b.ToString("x2")); 

//2. A login is done with the m_SecurityService object 
if (securityService.Login(builder.ToString())) 
{ 
    string ssoToken = Request.QueryString["SSOTOKEN"]; 
    string ssoID = Request.QueryString["SSOID"]; 
    if (!String.IsNullOrEmpty(ssoToken) && !String.IsNullOrEmpty(ssoID)) 
    { 
     // Check with webserice if the token is valid. 
     Knooppunt.SSO.GenericSSO sso = new Knooppunt.SSO.GenericSSO(); 
     sso.CookieContainer = securityService.CookieContainer; 
     try 
     { 
      if (sso.validateSSOToken(Convert.ToInt32(ssoID), ssoToken)) 
      { 
       loginSuccessFull = true; 
       FormsAuthentication.RedirectFromLoginPage("default user", false); 
      } 
     } 
     catch 
     { } 
    } 
} 

ответ

5

Если это действительно является вебсервис, вы должны использовать Windows Communication Foundation для сгенерируйте прокси-сервер и выполните вызов. Это значительно облегчает этот код.

Честно говоря, похоже, что пакет, который используется для подключения к веб-сервису, который вы используете (SSO?), Является довольно нестандартным и делает не что иное, как вывод из HttpWebRequest, который ОЧЕНЬ низкоуровневый, и слишком сложно использовать.

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

Вы также можете использовать другие аспекты WS-Security specifications (например, кодирование сообщения и т. Д. И т. Д.) Для обеспечения безопасности вашего сервиса.

Обратите внимание, что WCF поддерживает все этих параметров, поэтому вам не нужно делать какие-либо из этих кодировок из коробки, и вы также можете разместить их в IIS.

Хорошая ссылка для новичков на WCF Michelle Bustamante's "Learning WCF: A Hands-On Guide".

После этого, для более продвинутого контента WCF (особенно, если вы хотите узнать о концепции вращается вокруг безопасности в WCF и WS- * в целом) я высоко рекомендую "Programming WCF Services" by Juval Lowy.

+0

Полностью согласовано. Не нужно заново изобретать колесо. WCF - именно то, о чем вы просите. –

+0

@Sem Dendonker: Можете ли вы использовать .NET 3.0? WCF находится в .NET 3.0, и это было чистое дополнение (только библиотеки были добавлены, никаких изменений в библиотеки базового класса или CLR), поэтому при использовании .NET 2.0 это должно быть безболезненно. – casperOne