我正在使用IdentityServer4让我的客户从JavaScript登录和访问网页和api,并且运行良好。但是,有一项新的要求,即不使用用户名和密码从身份服务器获取访问令牌,然后使用用户名和密码访问api,使用Bearer身份验证.我需要使用“基本”身份验证头直接调用api,api将向标识服务器确认身份。类似于下面用于访问ZenDesk api的代码.
using (var client = new HttpClient())
{
var username = _configuration["ZenDesk:username"];
var password = _configuration["ZenDesk:password"];
var token = Convert.ToBase64String(Encoding.ASCII.GetBytes(username + ":" + password));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", token);
var response = client.PostAsync("https://...对我如何实现这一点有什么帮助吗?在IdentityServer4中有什么可以适应这种方法的东西吗?我对.Net服务器和标识服务器都使用了api Core3.1。
另一种(看似常见的)方法是为每个用户生成一个api密钥,然后允许用户像这样调用api .
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(URL_HOST_API);
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("ApiKey", "123456456123456789");
…
}有什么想法?
发布于 2020-09-02 23:58:19
@nahidf有一个很好的方法,我只想补充一下,您也可以使用自定义资源所有者密码验证器。它允许您实现您自己的密码验证器,如下所示
编辑:这是为了让你不用使用身份模型
public class ApiResourceOwnerPasswordValidation : IResourceOwnerPasswordValidator
{
public async Task ValidateAsync(ResourceOwnerPasswordValidationContext context)
{
var user = await _dbContext.Users.FirstOrDefaultAsync(a =>
(a.UserName == context.UserName || a.Email.ToLower().Trim() == context.UserName.ToLower().Trim())
&& context.Password.VerifyHashedPassword(a.Password));
if (user != null)
{
context.Result = new GrantValidationResult(
subject: user.Id.ToString(),
authenticationMethod: "custom",
claims: AssambleClaims(user)
);
user.LoggedIn = DateTime.UtcNow;
await _dbContext.CommitAsync();
}
else
{
context.Result = new GrantValidationResult(
TokenRequestErrors.InvalidGrant,
"Invalid credentials");
}
}
}https://stackoverflow.com/questions/63699424
复制相似问题