Сбой базовой аутентификации ServiceStack

#c# #servicestack

#c# #servicestack

Вопрос:

Я пытаюсь использовать базовую аутентификацию ServiceStack, но даже после передачи правильных учетных данных я получаю сообщение об ошибке:

 [Authenticate: 6/16/2014 4:00:22 AM]: [REQUEST: {UserName:john,Password:test}] 
ServiceStack.HttpError: Invalid BasicAuth credentials at 
ServiceStack.Auth.BasicAuthProvider.Authenticate(IServiceBase authService, IAuthSession 
session, Authenticate request) at 
ServiceStack.Auth.AuthenticateService.Authenticate(Authenticate request, String provider, 
IAuthSession session, IAuthProvider oAuthConfig) at 
ServiceStack.Auth.AuthenticateService.Post(Authenticate request) at 
ServiceStack.Auth.AuthenticateService.Get(Authenticate request) at lambda_method(Closure , 
Object , Object ) at ServiceStack.Host.ServiceRunner`1.Execute(IRequest request, Object 
instance, TRequest requestDto)
  

Строки кода в моей AppHost.cs функции настройки класса выглядят следующим образом:

 // Register AuthFeature with custom user session and Basic auth provider
Plugins.Add(new AuthFeature(
() => new AuthUserSession(),
new AuthProvider[] { new BasicAuthProvider() }
));

Plugins.Add(new RegistrationFeature());

// register storage for user sessions 
container.Register<ICacheClient>(new MemoryCacheClient());
container.Register<ISessionFactory>(c => new SessionFactory(c.Resolve<ICacheClient>()));

var userRep = new InMemoryAuthRepository();
container.Register<IUserAuthRepository>(userRep);

//Add a user for testing purposes
string hash;
string sa<
new SaltedHash().GetHashAndSaltString("test", out hash, out salt);
userRep.CreateUserAuth(new UserAuth
{
    Id = 1,
    DisplayName = "DisplayName",
    Email = "as@if.com",
    UserName = "john",
    FirstName = "FirstName",
    LastName = "LastName",
    PasswordHash = hash,
    Salt = salt,
}, "test");
  

И URL-адрес, который я использую для аутентификации, является:

 http://<domain>:63743/auth?Username=johnamp;Password=test
  

Пожалуйста, дайте мне знать, что может быть основной причиной такого поведения?

Ответ №1:

Не похоже, что вы правильно используете базовую аутентификацию, BasicAuthProvider в ServiceStack означает HTTP Basic Auth: (т. Е. Это не означает простой аутентификации).

В наших ServiceClients включена поддержка BasicAuth, некоторые примеры этого есть в AuthTests.cs:

Способ отправки базовой аутентификации HTTP — это использование заголовка Authorization HTTP, например:

 Authorization: basic {bas64encoded user:pass}
  

Вот пример отправки базовой аутентификации HTTP с помощью веб-запроса:

 var base64Token = Convert.ToBase64String(
    Encoding.UTF8.GetBytes(AllowedUser   ":"   AllowedPass));
var req = (HttpWebRequest)WebRequest.Create("http://domain.com/secure");
req.Headers["Authorization"] = "basic "   base64Token;
  

Если вы хотите войти в систему через URL, то вы хотите зарегистрировать CredentialsAuthProvider , т.е.:

 Plugins.Add(new AuthFeature(() => new AuthUserSession(),
    new AuthProvider[] { new CredentialsAuthProvider() }
));
  

Что позволит вам войти в систему по URL:

 /auth/credentials?Username=johnamp;Password=test
  

Создание собственного поставщика пользовательских учетных данных

Если вы предпочитаете, вы можете предоставить свой собственный пользовательский поставщик аутентификации, который вы можете наследовать CredentialsAuthProvider и переопределять TryAuthenticate с помощью собственной пользовательской реализации, например:

 public class CustomCredentialsAuthProvider : CredentialsAuthProvider
{
    public override bool TryAuthenticate(IServiceBase authService, 
        string userName, string password)
    {
        return userName == "john" amp;amp; password == "test";
    }
}
  

С помощью которого вы можете затем зарегистрироваться:

 Plugins.Add(new AuthFeature(() => new AuthUserSession(),
    new AuthProvider[] { 
        new CustomCredentialsAuthProvider(),
    }
));