Я, должно быть, что-то пропустил, но получаю неуполномоченные ошибки для операций, которые аннотируются с помощью [Authorize]
ПОСЛЕ успешного входа в систему. Я пробовал аннотацию на нескольких уровнях: класс службы, RequestDTOs, а также отдельные методы моего класса обслуживания. Поведение всегда одно и то же.Servicestack - НЕСАНКЦИОНИРОВАН после успешного входа в систему
Я создал свой собственный AuthProvider, полученный от CredentialsAuthProvider
. Я НЕ использую OrmLite, я использую NHibernate 4. Мой клиент - приложение WPF. Мой метод AppHost.Configure() выглядит следующим образом:
public override void Configure(Container container)
{
//Config examples
//this.Plugins.Add(new PostmanFeature());
//this.Plugins.Add(new CorsFeature());
Plugins.Add(new AuthFeature(() => new AuthUserSession(), new IAuthProvider[]
{
new BediCredentialsAuthProvider(),
}
));
Plugins.Add(new ValidationFeature());
container.RegisterValidators(typeof(AppUserValidator).Assembly);
container.RegisterAs<BediAuthEvents, IAuthEvents>();
container.Register<ICacheClient>(new MemoryCacheClient());
}
А потом я заметил некоторые другие странное поведение (для меня): Я реализовал пользовательские AuthEvents для OnAuthenticated()
и OnLogout
. Я пишу запись в обоих случаях. Я использую свойство session.UserAuthName
в обоих случаях. В OnAuthenticated()
это свойство заполнено правильно. После вызова операции, когда я получил несанкционированную ошибку, метод OnLogout
не может ссылаться на свойство session.UserAuthName
, потому что это null.
Любая идея, что здесь происходит неправильно? Что-то кажется неправильным с моими занятиями, но я понятия не имею, что!
Update Сообщение
К сожалению, я неправильно набранный мой аннотацию. Я использую [Authenticate]
и не[Authorize]
! Вот пример из внутри моего класса обслуживания:
[Authenticate]
public object Post(CreateAppUser request)
{ .... }
[Authenticate]
public object Put(UpdateAppUser request)
{ .... }
второе обновление
Вот код из моего AuthProvider:
public class BediCredentialsAuthProvider : CredentialsAuthProvider
{
public override object Authenticate(IServiceBase authService, IAuthSession session, Authenticate request)
{
var authResponse = (AuthenticateResponse)base.Authenticate(authService, session, request);
var user = (AppUser)authService.Request.Items["AppUser"];
authResponse.Meta = new Dictionary<string, string>();
authResponse.Meta.Add("TenantName", user.TenantName);
authResponse.Meta.Add("ResetPwdRequired", user.MustChangePwd.ToString());
authResponse.Meta.Add("IsLockedOut", user.IsLockedOut.ToString());
authResponse.Meta.Add("Email", user.EmailAddress);
authResponse.Meta.Add("DisplayName", user.DisplayName);
authResponse.Meta.Add("RemoteIP", authService.Request.RemoteIp);
return authResponse;
}
public override bool TryAuthenticate(IServiceBase authService, string userName, string password)
{
AppUser user = null;
using (var session = NhSessionFactories.OpenSession(TopinConstants.TopInDbFactory))
{
using (var transaction = session.BeginTransaction())
{
try
{
var appUserRepo = new AccountManagementRepository(session);
user = appUserRepo.GetAppUser(userName);
transaction.Commit();
session.Close();
}
catch (Exception ex)
{
Log.Error($"Error retrieving user {user} to authenticate. Error: {ex}");
throw;
}
}
}
if (user == null)
throw HttpError.NotFound("User '{0}' not found. Please try again.".Fmt(userName));
authService.Request.Items.Add("AppUser", user);
var pwdMgr = new PwdManager();
var hpwd = pwdMgr.GetHashedPassword(password, user.Salt);
return hpwd == user.Password;
}
}
Извините, я ошибался в своем сообщении! Я исправил его, обновив его. – ThommyB
@ThommyB ok, но невозможно сказать, что проблема в этом только описании, я предполагаю, что это в вашем обычном AuthProvider impl. Обратите внимание, что вам не нужно регистрировать 'MemoryCacheClient', это уже значение по умолчанию. Является ли «UserAuthName» заполненным в CacheClient после аутентификации? – mythz
Я снова обновил сообщение и добавил код для своего AuthProvider. Я зарегистрировал MemoryCacheClient во время поиска проблемы, потому что я думал, что это пропало .... – ThommyB