#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(),
}
));