2013-03-11 3 views
3

Я оцениваю ServiceStack с помощью OrmLite. Встроенная служба Auth, наряду с сеансом и кешем, намного лучше, чем поставщик членства в ASP.NET.Добавление функций в ServiceStack auth provider

Однако из коробки Auth служба не предоставляет некоторые из функций, необходимых для приложений, которые мы хотим построить, как:

  • Изменения пароля
  • Блокировка счета после 3 неудачных попыток входа
  • Отключение учетных записей пользователей
  • напоминание пароля вопрос и ответ
  • журнал аудита в журнале о попытках

Нужно ли мне создавать пользовательский поставщик auth или есть что-то там, которое уже предоставляет эту функцию?

Большое спасибо!

ответ

1

Я только начинаю осуществлять сброс пароля и может видеть два пути ее достижения (я не проверял - или даже пробовали - либо еще):

1.Create класс, который наследует от регистрации и обрабатывает PUT. Затем следует вызвать метод UpdateUserAuth класса регистрации, который изменит пароль. Проблема - для меня - вот в том, что для проверки ввода требуется указать имя пользователя и пароль, а не только один (мы используем только адрес электронной почты как идентификатор). Это можно было бы обойти, отключив функцию проверки.

2.Создание службы сброса пароля, выполняющей то, что делает UpdateUserAuth.

var session = this.GetSession(); 
var existingUser = UserAuthRepo.GetUserAuth(session, null); 
if (existingUser == null) 
{ 
    throw HttpError.NotFound("User does not exist"); 
} 

var newUserAuth = ToUserAuth(request); 
UserAuthRepo.UpdateUserAuth(newUserAuth, existingUser, request.Password); 

Очевидно нужно добавить соответствующую проверку в.

ОБНОВЛЕНО

Я кладу изменение пароль напоминание/сброс службы до как gist (Моей первой суть!)

+0

Я думаю, что для блокировки учетной записи и отключения учетной записи я бы расширил Поставщик аутентификации Credentials. Вероятно, используя поставщика кэша для хранения недопустимых попыток входа в систему и возможного блокировки/отключения, если они были основаны на времени. – MikeT

+0

Если вы написали его как функцию, затем отправили запрос Pull обратно в стек службы, мы все могли бы его использовать! – MikeT

+0

Да, я изучаю код, чтобы определить минимально возможное изменение, необходимое для достижения этого. На данный момент мне кажется, что мне нужно будет создать новую услугу. Я не уверен, беспокоиться об открытых провайдерах auth, поскольку они не смогут обеспечить тот же уровень функциональности, что и поставщик учетных данных. – user356247

1

вот что я сделал, хорошо работает. - Я понимаю, что «новый» является кодовым запах, просто впрыснуть его :)

 private int LoginAttempts = 0; 

    public override bool TryAuthenticate(IServiceBase authService, string userName, string password) 
    { 
     var authRepo = authService.TryResolve<IUserAuthRepository>(); 

     if (authRepo == null) 
     { 
      Log.WarnFormat("Tried to authenticate without a registered IUserAuthRepository"); 
      return false; 
     } 


     var session = authService.GetSession(); 

     UserAuth userAuth = null; 

     if (authRepo.TryAuthenticate(userName, password, out userAuth)) 
     { 
      session.PopulateWith(userAuth); 

      session.IsAuthenticated = true; 

      session.UserAuthId = userAuth.Id.ToString(CultureInfo.InvariantCulture); 

      session.ProviderOAuthAccess = authRepo.GetUserOAuthProviders(session.UserAuthId) 
       .ConvertAll(x => (IOAuthTokens)x); 


      return true; 
     } 
     else 
     { 
      LoginAttempts++; 

      if (LoginAttempts >= 3) 
      { 
       ServiceStack.ServiceInterface.Service s = new Service(); 

       s.Db.ExecuteSql("update [User] set AccountLocked = 'true' where Email='" + userName + "'"); 
      } 

      authService.RemoveSession(); 
      return false; 
     } 
    } 

, и я надеюсь, что mod_from_hell удается оставить это в покое !!!

+2

Боюсь, что есть серьезные ошибки, которые вы делаете, и это поставило под угрозу ваше приложение: - Переменная LoginAttempts является глобальной для всего вашего приложения. Что произойдет, если большее количество пользователей будет вводить неверные пароли одновременно? Вы сбросили счетчик после успешной попытки? - Вы используете sql с неэкранированными данными, это серьезная уязвимость, поскольку она может использоваться для SQL-инъекций – kvetis

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