我尝试使用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密钥一定有问题。
我错过了什么?
UDATE
在接收身份验证调用的服务器上,我已经配置了AuthFeature
插件,如下所示:
Plugins.Add(new AuthFeature(() => new AuthUserSession(),
new IAuthProvider[] {
new BizBusAuthProvider(),
new ApiKeyAuthProvider(AppSettings)
{
KeyTypes = new []{"secret", "publishable"},
},
}
));
此配置为每个新用户生成4个API密钥,上面定义的API密钥和默认创建的两个API密钥。
答案 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
};