Что-то не так с моей ручной реализацией Basic HTTP Authentication? - PullRequest
1 голос
/ 17 мая 2011

Я использую 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;
    }
}

Однако, когда я пытаюсь войти в систему с действительным именем пользователя и паролем, я все еще получаю несанкционированную ошибку. Что не так с моим кодом?

...