首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IdentityServer4直接对API使用ApiKey或基本身份验证

IdentityServer4直接对API使用ApiKey或基本身份验证
EN

Stack Overflow用户
提问于 2020-09-02 05:49:28
回答 3查看 3.5K关注 0票数 5

我正在使用IdentityServer4让我的客户从JavaScript登录和访问网页和api,并且运行良好。但是,有一项新的要求,即不使用用户名和密码从身份服务器获取访问令牌,然后使用用户名和密码访问api,使用Bearer身份验证.我需要使用“基本”身份验证头直接调用api,api将向标识服务器确认身份。类似于下面用于访问ZenDesk api的代码.

代码语言:javascript
复制
        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 .

代码语言:javascript
复制
using (var client = new HttpClient())
{
    client.BaseAddress = new Uri(URL_HOST_API);
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("ApiKey", "123456456123456789");
…
}

有什么想法?

EN

Stack Overflow用户

发布于 2020-09-02 23:58:19

@nahidf有一个很好的方法,我只想补充一下,您也可以使用自定义资源所有者密码验证器。它允许您实现您自己的密码验证器,如下所示

编辑:这是为了让你不用使用身份模型

代码语言:javascript
复制
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");
            }

        }
}
票数 0
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63699424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档