具有[Authenticate]和[ValidateApiKey]属性的ServiceStack身份验证

时间:2015-05-07 15:34:48

标签: authentication servicestack api-key

我有一些用[Authenticate]属性修饰的端点。现在,第三方客户端必须使用共享API密钥访问同一端点。

由于这两种情况的代码完全相同,我想首先检查当前请求是否来自经过身份验证的用户,如果没有,则检查是否提供了有效的API密钥。

有没有办法同时使用 [Authenticate] [ValidateApiKey] 属性?

类似的东西:

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

1 个答案:

答案 0 :(得分: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)
{
   // ....
}