2013-11-14 5 views
0

Я пытаюсь сделать доступ к службе, только если клиент аутентифицирован, и я поместил атрибут Authenticate, но он не работал, потому что когда я могу получить доступ к службе без проверки подлинности. Я поместил атрибут Authenticate перед запросом DTO, верхней частью службы и перед действием. Вот код сервиса Я хочу, чтобы обеспечитьАтрибут ServiceStack Authenticate не проверяет подлинность пользователя

[Authenticate] 
public class HelloService : Service 
{ 
    public const string HelloServiceCounterKey = "HelloServiceCounter"; 

    public object Any(HelloRequest request) 
    { 
      var userSession = SessionAs<AppHost.CustomUserSession>(); 
      Session.Set(HelloServiceCounterKey, Session.Get<int>(HelloServiceCounterKey) + 1); 
      var roles = string.Join(", ", userSession.Roles.ToArray()); 
      return new HelloResponse { Result = "Hello, " + request.Name + ", your role(s): " + roles }; 

    } 
} 

У меня есть это в моем AppHost Настройка (Funq.Container контейнер)

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

public class CustomUserSession : AuthUserSession 
    { 
     public string CompanyName { get; set; } 
    } 

    public class CustomCredentialsAuthProvider : CredentialsAuthProvider 
    { 
     public override bool TryAuthenticate(IServiceBase authService, string userName, string password) 
     { 
      if (!Membership.ValidateUser(userName, password)) return false; 

      var session = (CustomUserSession)authService.GetSession(false); 
      session.CompanyName = "Company from DB"; 
      session.UserAuthId = userName; 
      session.IsAuthenticated = true; 

      // add roles 
      session.Roles = new List<string>(); 
      if (session.UserAuthId == "admin") session.Roles.Add(RoleNames.Admin); 
      session.Roles.Add("User"); 

      return true; 
     } 
    } 

Когда доступ на службу в линии

var roles = string.Join(", ", userSession.Roles.ToArray()); 

obviosly return NULL, потому что не были подвергнуты апробации.

Что необходимо сделать для аутентификации атрибута в этом случае?

ответ

1

вам нужно настроить поставщика проверки подлинности в вас приложение конфигурации хоста следующим образом:

public override void Configure(Container container) 
{ 
    Plugins.Add(new AuthFeature(() => new AuthUserSession(), new IAuthProvider[] 
       { 
       your providers here... 
       })); 

} 

Edit:

Предполагая, что CustomUserSession наследует от IAuthSession вы можете изменить

var session = (CustomUserSession)authService.GetSession(false); 

Для

var session = authService.GetSession<CustomUserSession>(); 

и насколько я вижу, что вы не спасаете сеанс после аутентификации

попробовать что-то вроде этого:

public override object Authenticate(IServiceBase authService, IAuthSession session, ServiceStack.ServiceInterface.Auth.Auth request) 
     { 

      string userName = request.UserName; 
      string password = request.Password; 

      if (!LoginMatchesSession(session, userName)) 
      { 
       authService.RemoveSession(); 
       session = authService.GetSession(); 
      } 

      if (TryAuthenticate(authService, userName, password)) 
      { 
       authService.SaveSession(session, SessionExpiry); 
       if (session.UserAuthName == null) 
        session.UserAuthName = userName; 
       OnAuthenticated(authService, session, null, null); 

       return new AuthResponse 
       { 
        UserName = userName, 
        SessionId = session.Id, 
        ReferrerUrl = RedirectUrl 
       }; 
      } 

      throw new HttpError(HttpStatusCode.BadRequest, "400", "wrong credentials"); 

     } 


    public override bool TryAuthenticate(IServiceBase authService, string userName, string password) 
     { 
      var session = authService.GetSession<CustomUserSession>(); 
      if (!Membership.ValidateUser(userName, password)) return false; 


       session.IsAuthenticated = true; 
       session.Id = authService.GetSessionId(); 
       return true; 


      } 

EDIT: есть другая недостающая часть необходимо настроить cacheclient поскольку все сессии управляются в кэше

попробовать что-то вроде этого:

container.Register<ICacheClient>(new MemoryCacheClient(){FlushOnDispose = false}); 

Можете ли вы обновить свой код с помощью конфигурации хоста?

+0

Я настроил своего провайдера аутентификации как CustomCredentialsAuthProvider, и я добавил код к исходному вопросу @pedro надеюсь, что вы можете мне помочь –

+0

все еще не работает, я до сих пор могу получить доступ к сервису без проверки подлинности @Pedro –

+0

взглянуть на мое обновление –

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