Я использую WCF для разработки веб-службы RESTful, которая выступает в качестве прокси-сервера для набора хранимых процедур, к которым из соображений безопасности невозможно получить прямой доступ из приложений, подключенных к Интернету.
Класс, реализующий сервис DataContract
, имеет вспомогательное свойство, которое извлекает имя пользователя, вошедшего в систему в данный момент, или генерирует HTTP 401 неавторизованный ответ, если в данный момент не зарегистрирован ни один пользователь.
[ServiceContract]
public class MyService
{
// The helper property
string UserName
{
get
{
WebOperationContext context = WebOperationContext.Current;
if (context != null)
{
string authHeader = context.IncomingRequest.Headers[HttpRequestHeader.Authorization];
if (authHeader != null && authHeader.StartsWith("Basic "))
{
string string64 = authHeader.Substring(6);
byte[] array64 = Convert.FromBase64String(string64);
string decoded = ASCIIEncoding.ASCII.GetString(array64);
string[] authParts = decoded.Split(':');
if (ValidateLogin(authParts[0] /*userName*/,
authParts[1] /*password*/))
return authParts[0];
}
}
OutgoingWebResponseContext outgoing = context.OutgoingResponse;
outgoing.StatusCode = HttpStatusCode.Unauthorized;
outgoing.Headers[HttpResponseHeader.WwwAuthenticate] = "Basic";
return null;
}
}
[OperationContract]
public int LengthOfUserName()
{
return UserName.Length;
}
}
Однако, когда я пытаюсь войти в систему с действительным именем пользователя и паролем, я все еще получаю несанкционированную ошибку. Что не так с моим кодом?