首页 文章

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

提问于
浏览
2

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

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

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

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

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

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

1 回答

  • 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 { ... }
    

    另一种方法可能是创建一个特殊的"Company"用户作为占位符来保存所有公司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,它们将允许用户使用他们的偏好进行身份验证 .

相关问题