Если вы размещаете свою службу в 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: Пароль
наилучшими пожеланиями дб