博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
asp.net core系列 55 IS4使用Identity密码保护API
阅读量:7148 次
发布时间:2019-06-29

本文共 4428 字,大约阅读时间需要 14 分钟。

一.概述

  OAuth 2.0资源(web api)所有者密码授权,允许客户端(Client项目)向令牌服务(IdentityServer项目)发送用户名和密码,并获取代表该用户的访问令牌。在官方文档中讲到:规范通常建议不要使用“资源所有者密码授权”。当用户进行身份验证并请求访问令牌时,使用一个交互式OpenID Connect流程通常要好得多(下篇再了解)。

  本篇介绍“资源所有者密码授权”是因为这种授权允许我们快速启动IdentityServer。开源地址:

  下面示例与官方示例有点区别,该示例使用了Identity密码保护API。关于asp.net core Identity的了解实现,查看之前章节或官方文档。示例中分别是IdentityServer令牌项目、 API资源项目、 Client访问项目。与上篇相比一样,还是三个项目,区别在于:

  (1) IdentityServer令牌项目换成了含有asp.net core Identity的MVC项目。

  (2) API资源项目没有变动。

  (3) Client访问项目使用了用户名和密码访问受保护的API。

 

二. IdentityServer项目

  IdentityServer令牌项目是包含了 Identity功能(安装:Install-Package IdentityServer4),在项目中,添加了Config.cs类和Startup.cs中加入了IdentityServer的启动配置。下面是MVC项目目录结构:

  (1) 添加用户

    IdentityServer类库中自带TestUser测试类,是DTO数据传输对象,存储用户及其声明(claims)。TestUser是用于测试中的内存(In-memory)用户对象。在正式环境下,获取数据库中的用户表(User),需要结合IdentityServer的IResourceOwnerPasswordValidator接口(不再本篇讲述中)。 下面通过在config.cs类中添加GetUsers方法获取用户密码,存储在TestUser数据传输对象中。

///         ///获取用户,这些用户可以访问受密码保护的API        ///         ///         /// 
public static List
GetUsers(ServiceProvider provider) { var webAppIdentityDemoUser = provider.GetRequiredService
>(); IList
users = null; //获取Identity的User表用户,条件是属于Administrator角色的用户 users = webAppIdentityDemoUser.GetUsersInRoleAsync("Administrator").Result; List
testUserList = new List
(); foreach (WebAppIdentityDemoUser user in users) { testUserList.Add(new TestUser() { SubjectId = user.Id.ToString(), Username = user.UserName, Password = user.PasswordHash }); } return testUserList; }

  (2) 然后在Startup类的ConfigureServices方法中使用IdentityServer注入测试用户:

ServiceProvider provider = services.BuildServiceProvider();            var builder = services.AddIdentityServer()                .AddInMemoryIdentityResources(Config.GetIdentityResources())                .AddInMemoryApiResources(Config.GetApis())                .AddInMemoryClients(Config.GetClients())                .AddTestUsers(Config.GetUsers(provider));

  (3) 定义客户端, 使用密码授予访问此API(资源范围:api1)

    在config.cs类中,定义客户端,通过修改AllowedGrantTypes枚举来简单地向现有客户端添加对授权类型的支持, 将以下代码添加到客户端配置中, 里面支持二个Client授权类型,分别是ClientCredentials使用凭证来访问令牌和ResourceOwnerPassword 使用密码来访问令牌。

public static IEnumerable
GetClients() { return new List
{ new Client { ClientId = "client", // no interactive user, use the clientid/secret for authentication AllowedGrantTypes = GrantTypes.ClientCredentials, // secret for authentication ClientSecrets = { new Secret("secret".Sha256()) }, // scopes that client has access to AllowedScopes = { "api1" } }, // resource owner password grant client new Client { ClientId = "ro.client", AllowedGrantTypes = GrantTypes.ResourceOwnerPassword, ClientSecrets = { new Secret("secret".Sha256()) }, AllowedScopes = { "api1" } } }; }

  

三.Client项目

  该Client项目类似于上篇介绍的Client项目,该项目名为ResourceOwnerClient, 该Client将收集用户名和密码,并在令牌请求期间,将其发送到IdentityServer令牌服务(WebAppIdentityDemo项目)

// request token 请求令牌            var tokenResponse = await client.RequestPasswordTokenAsync(new PasswordTokenRequest            {                Address = disco.TokenEndpoint,                ClientId = "ro.client",                ClientSecret = "secret",                UserName = "924964690@qq.com",                Password = "AQAAAAEAACcQAAAAEH4Xhui5BByq6d8VS5Z+S2o2SnlkyrP5pN9CmMpgJ4QiIVrt7lBLzDlEWa6AdlpxpA==",                Scope = "api1"            });            if (tokenResponse.IsError)            {                Console.WriteLine(tokenResponse.Error);                return;            }            Console.WriteLine(tokenResponse.Json);            Console.WriteLine("\n\n");

  最后测试,先启动WebAppIdentityDemo项目程序,再启动API程序,最后启动Client客户端来访问API,通过下图可以了解到:(1)客户端请求使用“用户名和和密码”访问令牌(token)成功, (2) 客户端使用令牌(AccessToken)来访问受密码保护的web API接口成功。

  

  

  参考文献

    

 

    

 

转载于:https://www.cnblogs.com/MrHSR/p/10709099.html

你可能感兴趣的文章
Json数据,日期的转换
查看>>
comboBox绑定数据库、模糊查询
查看>>
Jmeter 使用集合点
查看>>
第八周网络攻防作业
查看>>
页面输出缓存之ASP.Net性能优化篇
查看>>
内网中本机如何开远程桌面,接受其他主机连接到本机
查看>>
分组背包问题
查看>>
本地安装xssing
查看>>
浏览网页常用快捷键
查看>>
mySQL 视图
查看>>
软件包管理 之 用apt+synaptic 在线安装或升级Fedora core 4.0 软件包── 为新手指南...
查看>>
JS面向对象、prototype、call()、apply()
查看>>
初步接触XCode和IPhone Simulator
查看>>
约束满足问题的局部搜索
查看>>
Jquery 遍历数组之grep()方法介绍
查看>>
黑马程序员—12-oc类跟对象
查看>>
Django分页
查看>>
吐槽开发的代码未自测直接给 QA 测试带来的小烦恼 分类: JavaScri...
查看>>
原生选项卡切换
查看>>
C# DataGridView中指定的单元格不能编辑
查看>>