2013-08-27 2 views
0

Я работаю над мобильным приложением jQuery. У меня есть служба RESTful WCF, которая предоставляет некоторые данные JSON, которые приложение jqm потребляет.Проверка подлинности WCF из html/javascript клиента

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

В настоящее время это выглядит примерно так:

Diagram.

ответ

1

Если вы размещаете свою службу в IIS и хотите использовать пользовательское имя пользователя/пароль-валидатор, вы можете решить эту проблему, внедрив HttpModule, который будет реализовывать Basic-authentication.

public class AuthenticationModule : IHttpModule 
{ 
    void IHttpModule.Dispose() {} 

    void IHttpModule.Init(HttpApplication context) 
    { 
     context.AuthenticateRequest += ContextOnAuthenticateRequest; 
     context.EndRequest += ContextOnEndRequest; 
    } 

    private void ContextOnEndRequest(object sender, EventArgs eventArgs) 
    { 
     HttpContext context = HttpContext.Current; 

     if(context.Response.StatusCode != 401) 
      return; 

     context.Response.AddHeader("WWW-Authenticate", "Basic realm=\"SomeRealm\""); 
    } 

    private void ContextOnAuthenticateRequest(object sender, EventArgs eventArgs) 
    { 
     HttpContext context = HttpContext.Current; 
     string authHeader = context.Request.Headers["Authorization"]; 
     if(string.IsNullOrWhiteSpace(authHeader) || !authHeader.StartsWith("Basic ")) 
      DenyAccess(); 

     try 
     { 
      var encoded = authHeader.Substring(6); 
      var decoded = Encoding.UTF8.GetString(Convert.FromBase64String(encoded)); 
      var splits = decoded.Split(':'); 
      var username = splits[0]; 
      var password = splits[1]; 

      var principal = //TODO Validate and return a class implementing System.Security.Principal.IPrincipal 
      if (principal != null) 
       context.User = principal; 
      else 
       DenyAccess(); 
     } 
     catch(Exception e) 
     { 
      DenyAccess(); 
     } 
    } 

    private void DenyAccess() 
    { 
     var context = HttpContext.Current; 
     context.Response.StatusCode = 401; 
     context.Response.End(); 
    } 
} 

В вашей работе вы можете получить пользователь, написав: ServiceSecurityContext.Current.PrimaryIdentity А также не забудьте установить aspNetCompatibilityEnabled к истине.

С вашего JS-клиента, просто включите это в заголовке: Авторизация: Basic Base64EncodedStringWithUsername: Пароль

наилучшими пожеланиями дб

Смежные вопросы