zoukankan      html  css  js  c++  java
  • IdentityServer4在Asp.Net Core中的应用(二)

        继续上次授权的内容,客户端模式后我们再说以下密码模式,先回顾下密码模式的流程:

    我们还是使用上次的代码,在那基础上修改,在IdentityServer4里面有一个IdentityServer4.Test的引用,它里面包含了测试用户的类,我们先将这个引用添加进来,并配置我们的用户信息,修改Config类,添加一个GetTestUsers()方法,当然在实际项目中,我们需要去从我们的数据库中去读取用户名及密码等信息,这里只做测试,添加内容如下:

    我们再添加一个客户端,更改其授权模式为密码模式,内容如下:

    修改其授权模式为ResourceOwnerPassword,下面再将我们的用户依赖注入到系统中,

    至此我们的授权服务器已经修改完成,我们通过Postman测试是否可以拿到我们的access_token

    OK,测试成功。我们的Api是不需要改动的,下面我们再新创建一个第三方应用程序,去请求授权并获取资源,代码如下

    using System;
    using System.Net.Http;
    using IdentityModel;
    using IdentityModel.Client;
    
    namespace ThirdPartyAppByPwd
    {
        class Program
        {
            static void Main(string[] args)
            {
                //请求授权服务器
                var diso=DiscoveryClient.GetAsync("http://localhost:5000").Result;
                if(diso.IsError)
                {
                    Console.WriteLine(diso.Error);
                }
    
                //授权服务器根据客户端发来的请求返回令牌
                var tokenClient=new TokenClient(diso.TokenEndpoint,"pwdClient","pwdSecrect");
                //使用密码模式
                var tokenResponse =tokenClient.RequestResourceOwnerPasswordAsync("allen","123456","api").Result;
                if(tokenResponse.IsError)
                {
                    Console.WriteLine(tokenResponse.Error);
                }
                //如果成功,则打印输出返回的令牌信息
                else
                {
                    Console.WriteLine(tokenResponse.Json);
                }
    
                //创建HttpClient对象
                var httpClient=new HttpClient();
    
                //设置Authorization的Value值
                httpClient.SetBearerToken(tokenResponse.AccessToken);
    
                //根据授权服务器返回的令牌信息请求Api资源
                var response= httpClient.GetAsync("http://localhost:5001/api/values").Result;
    
                //如果返回结果为成功,输出Api资源的结果
                if(response.IsSuccessStatusCode)
                {
                    Console.WriteLine(response.Content.ReadAsStringAsync().Result);
                }
            }
        }
    }

    只改动了两个地方,把ClientID和ClientSecret的值修改了,以及请求授权服务器的方法改为: 

    RequestResourceOwnerPasswordAsync(username,password,scope),运行结果如下:

    以上就是完整的密码模式的授权,下面是对以上的简化流程:

    扫描二维码关注我的公众号,共同学习,共同进步!

  • 相关阅读:
    C#与Java的几点区别
    用VB读取记事本的内容,控制计算器的按钮(VB6)
    通过实例说明Java中的多态
    [导入]析构函数(内存泄漏,三法则)
    [导入]const限制符
    [导入]类的一些特殊限制成员
    [导入]基类的复制控制函数
    [导入]容器适配器
    [导入]派生类到基类转换的可访问性
    [导入](复制、默认)构造函数
  • 原文地址:https://www.cnblogs.com/Allen0910/p/8663655.html
Copyright © 2011-2022 走看看