2016-10-17 6 views
1

Я, должно быть, что-то пропустил, но получаю неуполномоченные ошибки для операций, которые аннотируются с помощью [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; 
    } 
} 

ответ

0

ServiceStack-х Request FilterAttribute для аутентификации пользователя есть доступ для вызова Служба - это атрибут [Authenticate]. Независимый атрибут MVC [Authorize] предназначен для использования только в MVC без отношения к аутентификации ServiceStack.

+0

Извините, я ошибался в своем сообщении! Я исправил его, обновив его. – ThommyB

+0

@ThommyB ok, но невозможно сказать, что проблема в этом только описании, я предполагаю, что это в вашем обычном AuthProvider impl. Обратите внимание, что вам не нужно регистрировать 'MemoryCacheClient', это уже значение по умолчанию. Является ли «UserAuthName» заполненным в CacheClient после аутентификации? – mythz

+0

Я снова обновил сообщение и добавил код для своего AuthProvider. Я зарегистрировал MemoryCacheClient во время поиска проблемы, потому что я думал, что это пропало .... – ThommyB

Смежные вопросы