使用其他用户api密钥在servicestack中实现仅应用程序API密钥和机密

时间:2016-06-24 18:00:42

标签: api authentication servicestack

所以,我试图找出在我的ServiceStack api中实现以下身份验证的最佳方法。

我希望保护所有API调用,以便它们仅适用于我们定义的应用程序(所以半私有)。这些应用程序将链接到我们的公司表。所以,假设我们有一个表ApplicationKeys链接到公司。

此外,我们还有用户(也链接到公司)。还可以为这些用户提供api密钥以允许应用程序的特定用户相关功能。

如何/什么是允许应用程序使用这两个安全级别访问api的最佳方法。 1)仅需要对应用程序进行身份验证的端点。 2)需要对应用程序和用户进行身份验证的端点。

此外,我希望能够在验证上述1或2后使用新的JWT授权。

第一个想法(以及我还在做什么)是1的自定义AuthProvider。我以ApiAuthProvider为例。我必须更改auth repo的类型,以便它只对公司和api密钥进行验证。但是,即使第一位有效,我也不确定如何扩展它。

1 个答案:

答案 0 :(得分:3)

尝试支持多个API密钥身份验证提供程序会有问题,因为相同的HTTP承载令牌需要支持2个不同的API密钥提供程序,一个用于公司,另一个用于用户。

内置的ApiKeyAuthProvider适用于User API的密钥,并允许用户使用其中一个API密钥进行身份验证。

公司API密钥不同,因为它与任何用户无关,我最初的想法是将其作为请求过滤器限制来实现,而不是尝试将其集成为与用户绑定的AuthProvider。所以我可能会做一些事情,比如添加一个自定义X-Company-Key HTTP标头并添加一个请求过滤器属性来验证公司密钥,例如:

public class ValidateCompanyKeyAttribute : RequestFilterAttribute
{
    public override void Execute(IRequest req, IResponse res, object responseDto)
    {
        var companyKey = req.Headers["X-Company-Key"];
        var company = GetValidCopmany(companyKey);
        if (company == null)
        {
            res.StatusCode = (int)HttpStatusCode.Unauthorized;
            res.EndRequest();
            return;
        }
        req.Items["company"] = company; //if info needed in Services
    }
}

然后您可以在服务上生成,例如:

[ValidateCompanyKey]
public class CompanyServices : Service { ... }

另一种方法可能是创建一个特殊的公司"用户作为占位符来保存所有公司API密钥并维护哪个公司使用ApiKey表custom ref data properties之一的关键。当然,如果您要创建自己的自定义API密钥AuthProvider,则可以添加自己的显式字段。此方法的好处是您可以使用相同的Auth Provider来验证用户和公司API密钥。

要通过API密钥验证用户,您只需使用现有的ApiKeyAuthProvider和ServiceStack的内置[Authenticate]属性,例如:

[Authenticate]
public class UserServices : Service { ... }

不确定使用JWT的位置,HTTP请求只能包含1个承载令牌,如果他们通过API密钥进行身份验证,他们也不会使用JWT进行身份验证。您当然可以注册两个AuthProviders,允许用户使用他们的偏好进行身份验证。