如何在身份验证消息中放入Api密钥?

时间:2018-07-18 09:49:30

标签: servicestack

我正在尝试将api密钥身份验证提供程序与加密的消息传递插件结合在一起。

var client = new JsonServiceClient(home);
client.BearerToken = "somesecret";

有效

但是我希望我的apikey在消息中,所以我尝试了

        var authResponse = client.Post(new Authenticate
        {
            provider = ApiKeyAuthProvider.Name, 
            UserName = "somesecret"                                         
        });

此信息在运行时失败,未验证401。

我如何使它工作?

1 个答案:

答案 0 :(得分:1)

IAuthWithRequest身份验证提供者,例如API Key Auth Provider,需要根据每个请求的请求发送,该请求的Authenticated User Session仅在请求的生存期内建立持续时间强>。它不能与Authenticate服务一起使用,如您的示例所尝试的那样对客户端进行身份验证,它必须包含在对身份验证服务的每个请求中。

使用API​​密钥调用受保护服务的通常方法是仅填充BearerToken属性:

var client = new JsonServiceClient(baseUrl) {
    BearerToken = apiKey
};

这将让您致电[Authenticate]服务:

var response = client.Get(new Secure { Name = "World" });

加密消息支持

以前,您只能将User SessionId嵌入到加密消息请求中,但是我刚刚在Authenticating Encrypted Messaging Services中添加了BearerToken支持this commit,其作用类似于填充{{1 }},现在您可以通过让请求DTO实现SessionId来填充API KeyJWT Auth Providers中使用的BearerToken,例如:

IHasBearerToken

这将使您在调用受保护的服务时嵌入public class Secure : IHasBearerToken { public string BearerToken { get; set; } public string Name { get; set; } } ,例如:

BearerToken

与请求DTO中的所有内容一起嵌入和加密的位置。

或者,您也可以在IEncryptedClient encryptedClient = client.GetEncryptedClient(publicKey); var response = encryptedClient.Get(new Secure { BearerToken = apiKey, Name = "World" }); 上设置BearerToken属性一次,它将自动在实现IEncryptedClient的所有请求DTO上填充它,例如:

IHasBearerToken

v5.1.1(现在为available on MyGet)中提供了加密消息中新的BearerToken支持。