使用密码保护 API

OAuth 2.0 协议允许资源拥有者给客户端密码授权:客户端向令牌服务发送用户密码,以获取代表该用户的访问令牌。

该规范建议仅将“资源所有者密码授予”用于“可信”(或旧版)应用程序。一般来说,当您想验证用户身份并请求访问令牌时,使用交互式流程之一的 OpenID Connect 协议要更好一点。

虽然这么说,但是这种授权类型允许我们将用户的概念引入到我们的快速入门 IdentityServer 中,这就是我们展示它的原因。

添加用户

就像资源(又称作用域)和客户端使用内存存储一样,用户也是这么存储的。

Note

有关如何正确存储和管理用户帐户的更多信息,请查看基于 ASP.NET Identity 的快速入门。

TestUser 类表示测试用户及其声明。让我们通过将以下代码添加到我们的配置类来创建几个用户:

首先将以下 using 引用申明添加到 Config.cs 文件:

using IdentityServer4.Test;

public static List<TestUser> GetUsers()
{
return new List<TestUser>
{
new TestUser
{
SubjectId = "1",
Username = "alice",
Password = "password"
},
new TestUser
{
SubjectId = "2",
Username = "bob",
Password = "password"
}
};
}

然后通过 IdentityServer 注册测试用户:

public void ConfigureServices(IServiceCollection services)
{
// configure identity server with in-memory stores, keys, clients and scopes
services.AddIdentityServer()
.AddDeveloperSigningCredential()
.AddInMemoryApiResources(Config.GetApiResources())
.AddInMemoryClients(Config.GetClients())
.AddTestUsers(Config.GetUsers());
}

AddTestUsers 扩展方法在底层做了几件事情

  • 增加了对资源所有者密码授权的支持
  • 增加对用户相关服务的支持,通常由登录UI使用 (我们将在下一个 quickstart 示例中使用它)
  • 增加了基于配置文件获取测试用户信息的服务支持 (在下一个 quickstart 示例中您将学到更多关于用户信息文件配置方面的知识)

增加了资源所有者授权客户端密码访问的支持(密码授权访问)

您可以通过改变 AllowedGrantTypes 属性来简单地为现有客户添加对 grant 类型的支持。 如果您需要您的客户端能够完全支持所有授权类型。

通常,您希望为资源所有者用例创建一个单独的客户端,请将以下内容添加到您的客户端配置:

public static IEnumerable<Client> GetClients()
{
return new List<Client>
{
// other clients omitted... // resource owner password grant client
new Client
{
ClientId = "ro.client",
AllowedGrantTypes = GrantTypes.ResourceOwnerPassword, ClientSecrets =
{
new Secret("secret".Sha256())
},
AllowedScopes = { "api1" }
}
};
}

使用密码授权请求令牌

客户端看起来非常类似于我们为客户凭证授权所做的工作。主要的区别在于,客户端会以某种方式收集用户的密码,并在令牌请求期间将其发送给令牌服务。

因此 IdentityModel 的 TokenClient 可以提供帮助:

// request token
var tokenClient = new TokenClient(disco.TokenEndpoint, "ro.client", "secret");
var tokenResponse = await tokenClient.RequestResourceOwnerPasswordAsync("alice", "password", "api1"); if (tokenResponse.IsError)
{
Console.WriteLine(tokenResponse.Error);
return;
} Console.WriteLine(tokenResponse.Json);
Console.WriteLine("\n\n");

当您将令牌发送到identity API端点时,您将注意到一个小的但与客户端证书授权相比有着重要的不同。访问令牌将 包含一个 sub 声明,它能够惟一地标识用户。这个 "sub" 声明可以通过在调用API之后检查内容变量来查看,也可以通过控制台应用程序显示在屏幕上。

sub 声明的存在(或不存在)使 API 在调用时区分是客户端调用还是用户调用。

原文地址:https://github.com/ganqiyin/IdentityServer4/blob/dev/docs_cn/quickstarts/2_resource_owner_passwords.rst

【IdentityServer4文档】- 使用密码保护 API的更多相关文章

  1. 【IdentityServer4文档】- 使用客户端凭据保护 API

    使用客户端凭据保护 API quickstart 介绍了使用 IdentityServer 保护 API 的最基本场景. 接下来的场景,我们将定义一个 API 和一个想要访问它的客户端. 客户端将在 ...

  2. 【IdentityServer4文档】- 术语&演示服务器和测试

    术语 你需要了解一下,规范.文档和对象模型使用的术语有哪些. IdentityServer IdentityServer 是一个 OpenID Connect 提供程序 - 它实现了 OpenID C ...

  3. [API]使用Blueprint来高雅的编写接口文档 前后端api文档,移动端api文档

    网址:http://apiary.io/ 介绍:一款非常强大的前后端交互api设计编辑工具(编辑器采用Markdown类似的描述标记,非常高效),高颜值的api文档,还能生成多种语言的测试代码. 中文 ...

  4. api的mock开源工具;api文档生成器;api的mock工具;阿里系;其他开源

    django-rest-framework,即drf的api文档,包括自带的文档和其他三方文档,比如swagger.DRF Docs等 https://www.django-rest-framewor ...

  5. 【IdentityServer4文档】- 贡献

    贡献 我们非常乐于接受社区贡献,但您应遵循一些指导原则,以便我们可以很方便的解决这个问题. 如何贡献? 最简单的方法是打开一个问题并开始讨论.然后,我们可以决定如何实现一个特性或一个变更.如果您即将提 ...

  6. 如何真正实现由文档驱动的API设计?

    前言 本文主要介绍了一种新的开发思路:通过反转开发顺序,直接从API文档中阅读代码.作者认为通过这种开发方式,你可以更清楚地知道文档表达出什么以及它应该如何实现. 如果单从API文档出发,由于信息量不 ...

  7. 从Java官网下载最新的文档(包含API文档)

    Java学习资料(适合c转java的同学): Java中带包(创建及引用)的类的编译 - 小明快点跑 JAVA 对象引用,以及对象赋值 - 飘来荡去. Java官网下载页:https://www.or ...

  8. (转)如何真正实现由文档驱动的API设计?

    前言 本文主要介绍了一种新的开发思路:通过反转开发顺序,直接从API文档中阅读代码.作者认为通过这种开发方式,你可以更清楚地知道文档表达出什么以及它应该如何实现. 如果单从API文档出发,由于信息量不 ...

  9. JDK8 API离线文档免费下载&JavaEE API文档离线下载&API在线查看链接&常用的JAR包下载

    1.JDK8 API离线文档 链接:https://pan.baidu.com/s/1fYc-QesmYRumTEPmnSgEKA 提取码:2bdr 2.JavaEE API文档离线下载 链接:htt ...

随机推荐

  1. S3 Zeta使用python和opencv

    一.为SDK的Buildroot打上下面的补丁 diff --git a/package/opencv/Config.in b/package/opencv/Config.in index c046b ...

  2. Go 学习之路:引用类型与值类型

    Golang中只有三种引用类型:slice(切片).map(字典).channel(管道): 引用类型 引用类型理解为(C语言):指针 值类型 值的拷贝 下面以值类型和slice(切片)例子可知: p ...

  3. golang 错误处理与异常

    原文地址 golang 中的错误处理的哲学和 C 语言一样,函数通过返回错误类型(error)或者 bool 类型(不需要区分多种错误状态时)表明函数的执行结果,调用检查返回的错误类型值是否是 nil ...

  4. 5.18-笨办法学python-习题15(open等读取文件)

    from sys import argv script,filename=argv #不要忘了script(相当于一个固定变量),filename(可变变量) txt=open(filename) # ...

  5. nodejs fastdfs

    node端fastdfs客户端上传文件 var FdfsClient = require('fdfs'); var fdfs = new FdfsClient({ // tracker servers ...

  6. 20155305 2016-2017-2《Java程序设计》课程总结

    20155305 2016-2017-2<Java程序设计>课程总结 (按顺序)每周作业链接汇总 [预备作业1](http://www.cnblogs.com/20155305ql/p/6 ...

  7. 20155307 2016-2017 《Java程序设计》第三次实验报告

    (一)敏捷开发与XP 敏捷开发是一种以人为核心.迭代.循序渐进的开发方法."敏捷流程"是一系列价值观和方法论的集合.从2001年开始,一些软件界的专家开始倡导"敏捷&qu ...

  8. 20155317 2016-2017-2 《Java程序设计》第十学习总结

    20155317 2016-2017-2 <Java程序设计>第十学习总结 教材学习内容总结 1.网络编程的概念: 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作 ...

  9. 20155327 2016-2017-2《Java程序设计》课程总结

    20155327 2016-2017-2<Java程序设计>课程总结 每周作业链接汇总 预备作业1:http://www.cnblogs.com/l97----/p/6160983.htm ...

  10. 3-3 修改haproxy配置文件

    1.需求 2.个人思路 3.个人心得 4.