2015-05-07 6 views
0

У меня есть некоторые конечные точки, украшенные атрибутом [Authenticate]. Теперь стороннему клиенту приходится обращаться к той же конечной точке, используя общий ключ API.

Поскольку код был бы точно таким же для двух случаев, я бы хотел проверить сначала, если текущий запрос исходит от пользователя, прошедшего проверку подлинности, и, если нет, проверяет как резервную, если предоставляется действительный ключ API.

Есть ли способ использовать оба [Authenticate] и [ValidateApiKey] атрибутов для той же конечной точки?Аутентификация ServiceStack с атрибутами [Authenticate] и [ValidateApiKey]

что-то вроде:

[Authenticate | ValidateApiKey] 
public long Post(MyDto request) 
{ 
    // .... 
} 

ответ

2

Атрибуты могут быть объединены только для добавления функциональности, то есть они не могут быть использованы в качестве запасного или коммутатор. Для того, чтобы получить желаемое поведение вашего атрибут [ValidateApiKey] должен выполнить запасной вариант проверки в рамках его реализации, например:

public class ValidateApiKeyAttribute : RequestFilterAttribute 
{ 
    public override void Execute(IRequest req, IResponse res, object reqDto) 
    { 
     var session = req.GetSession(); 
     if (session == null || !session.IsAuthenticated) 
     { 
      //If not a valid key, execute the `[Authenticate]` attribute 
      //to handle failed response 
      if (!CheckValidApiKey(req)) 
       new AuthenticateAttribute().Execute(req,res,reqDto); 
     }    
    } 
} 

Примечания: Ответы должны быть ссылочными типами (например, DTO), либо сырые строки не типами значений.

public object Post(MyDto request) 
{ 
    // .... 
} 
+0

В нашем случае, мы в конечном итоге создание двух конечных точек, чтобы сохранить логику аутентификации отделенный. Но спасибо за разъяснение! – Francesco

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