未经API密钥授权

时间:2017-05-02 07:08:23

标签: servicestack

我尝试使用API​​密钥验证从服务到另一个服务的调用。管理服务在首次启动时会创建“服务帐户用户”。现在,当服务调用另一个服务时,我有:

Client = new JsonServiceClient("http://TheOtherServer:1234")
{
    Credentials = new NetworkCredential(<the string with my api key>, ""),
};
//.....
var request = new RequestDtoOfOtherServer
{
     //set some request props
};
try
{
    var result = Client.Get(request);
    //do something with result
}
catch (Exception ex)
{
     Log.Error($"Error: {ex}");
     throw;
}

无论我使用为调用服务用户发出的2个密钥使用哪个密钥,我总是会收到401 UNAUTHORIZED错误。我打开了接收服务上的RequestLogsFeature,但没有条目。

我调用的方法使用[RequiresAnyRole("User", "Administrator", "bizbusops-service", "SYSTEM")]注释,与我使用的API密钥相关的用户位于角色bizbusops-service中。此外,当我使用我的WPF UI并使用该用户登录(使用用户名/密码)时,我可以无错误地访问此方法。因此,建立服务器到服务器连接和/或API密钥一定有问题。

我错过了什么?

  • 以上使用NetworkCredential的代码是否在两台服务器之间建立会话并发出cookie?
  • 我在Redis数据库中看到有两个密钥发给服务的用户帐户。我可以同时使用它们,还是必须在服务器端的某处设置环境 KeyType ,例如在RequestFilter中?

UDATE 接收身份验证调用的服务器上,我已经配置了AuthFeature插件,如下所示:

Plugins.Add(new AuthFeature(() => new AuthUserSession(), 
    new IAuthProvider[] {
        new BizBusAuthProvider(),
        new ApiKeyAuthProvider(AppSettings)
        {
            KeyTypes = new []{"secret", "publishable"},
        },
    }
));

此配置为每个新用户生成4个API密钥,上面定义的API密钥和默认创建的两个API密钥。

1 个答案:

答案 0 :(得分:0)

如果您要使用Credentials发送API密钥,那么您需要注册ApiKeyAuthProvider,因此它是列出的第一个AuthProvider,例如:

Plugins.Add(new AuthFeature(() => new AuthUserSession(), 
    new IAuthProvider[] {
        new ApiKeyAuthProvider(AppSettings)
        {
            KeyTypes = new []{"secret", "publishable"},
        },
        new BizBusAuthProvider(),
    }
));

当.NET的WebRequest收到401 WWW-Authenticate质询响应时,它会在重试请求时自动添加Credentials

否则,您可以使用BearerToken发送API密钥,例如:

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