所以,我试图找出在我的ServiceStack api中实现以下身份验证的最佳方法。
我希望保护所有API调用,以便它们仅适用于我们定义的应用程序(所以半私有)。这些应用程序将链接到我们的公司表。所以,假设我们有一个表ApplicationKeys链接到公司。
此外,我们还有用户(也链接到公司)。还可以为这些用户提供api密钥以允许应用程序的特定用户相关功能。
如何/什么是允许应用程序使用这两个安全级别访问api的最佳方法。 1)仅需要对应用程序进行身份验证的端点。 2)需要对应用程序和用户进行身份验证的端点。
此外,我希望能够在验证上述1或2后使用新的JWT授权。
第一个想法(以及我还在做什么)是1的自定义AuthProvider。我以ApiAuthProvider为例。我必须更改auth repo的类型,以便它只对公司和api密钥进行验证。但是,即使第一位有效,我也不确定如何扩展它。
答案 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,允许用户使用他们的偏好进行身份验证。