Duende.IdentityServer——快速开始

一、新建鉴权中心服务

1、安装Duende.IdentityServer模板

打开命令行工具,输入以下命令(若已安装,直接跳过)

dotnet new --install Duende.IdentityServer.Templates

2、新建 ROC.Identity.Center项目,框架选择.net 6

打开vs 2022 新建解决方案命名为ROC.Identity.Center,选择Duende IdentityServer Empty(Duende Software)
在这里插入图片描述
创建完成之后的项目结构
在这里插入图片描述

3、添加Duende.IdentityServer Nuget包

在这里插入图片描述

4、定义api scope

打开Config.cs文件,添加/修改以下代码

public static IEnumerable<ApiScope> ApiScopes =>
       new ApiScope[]
           {
              new ApiScope(name:"api",displayName:"MyApi")
           };

在这里插入图片描述

5、定义client

打开Config.cs文件,添加/修改以下代码

public static IEnumerable<Client> Clients =>
    new Client[]
        {
            new Client{
                ClientId ="client",
                AllowedGrantTypes = GrantTypes.ClientCredentials,

                ClientSecrets = {
                new Secret("secret".Sha256())
                },

                AllowedScopes = {"api"}
            }
        };

在这里插入图片描述

6、配置IdentityServer

打开HostingExtensions.cs文件,添加以下代码

builder.Services.AddIdentityServer(options =>
    {
    options.EmitStaticAudienceClaim = true;
    })
    .AddInMemoryIdentityResources(Config.IdentityResources)
    .AddInMemoryApiScopes(Config.ApiScopes)
    .AddInMemoryClients(Config.Clients);

在这里插入图片描述

7、启动鉴权中心服务

打开服务根目录,运行dotnet run --urls="https://localhost:5001"在这里插入图片描述
在这里插入图片描述

8、访问知识中心

在这里插入图片描述

二、新建测试webApi服务

1、新建ROC.WebApi.Demo解决方案,框架选择.net 6

在这里插入图片描述

2、添加Microsoft.AspNetCore.Authentication.JwtBearer Nuget包

在这里插入图片描述

3、新建HostingExtensions扩展类

public static WebApplication ConfigureServices(this WebApplicationBuilder builder)
{
    // Add services to the container.

    builder.Services.AddControllers();
    // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
    builder.Services.AddEndpointsApiExplorer();
    builder.Services.AddSwaggerGen();

    return builder.Build();
}

public static WebApplication ConfigurePipeline(this WebApplication app)
{
    // Configure the HTTP request pipeline.
    if (app.Environment.IsDevelopment())
    {
        app.UseSwagger();
        app.UseSwaggerUI();
    }

    app.UseHttpsRedirection();

    app.MapControllers();


    return app;
}

4、添加Bearer认证

(1)修改HostingExtensions类的ConfigureServices方法,添加以下代码

//添加鉴权认证
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
                {
					//鉴权中心服务地址
                    options.Authority = "https://localhost:5001";

                    options.TokenValidationParameters = new TokenValidationParameters
                    {
                        ValidateAudience = false
                    };
                });

(2)修改HostingExtensions类的ConfigurePipeline方法,添加以下代码

app.UseAuthentication();
app.UseAuthorization();

5、修改Program.cs

在这里插入图片描述
将默认创建的Program.cs中的代码修改为

using ROC.WebApi.Demo;

var builder = WebApplication.CreateBuilder(args);

var app = builder
    .ConfigureServices()
    .ConfigurePipeline();

app.Run();

在这里插入图片描述

6、添加api 控制器

新建DemoController.cs,并添加Authorize特性,代码如下

[ApiController]
[Route("[controller]")]
[Authorize]
public class DemoController : ControllerBase
{
    private readonly ILogger<DemoController> _logger;

    public DemoController(ILogger<DemoController> logger)
    {
        _logger = logger;
    }

    [HttpGet(Name = "GetClaims")]
    public IActionResult GetClaims()
    {
        return new JsonResult(from c in User.Claims select new { c.Type, c.Value });
    }
}

在这里插入图片描述

6、修改api启动url端口

打开Properties文件夹下的launchSettings.json文件,将applicationUrl的值修改为
https://localhost:6001(端口可以自定义)
在这里插入图片描述

7、启动api

打开项目根目录,运行dotnet run命令
在这里插入图片描述

8、使用Apifox(或postman)请求api

(1)直接请求:https://127.0.0.1:6001/Demo
在这里插入图片描述
返回401状态码,提示无权限,因为DemoController上添加了Authorize认证特性,所以访问控制器之前需要到鉴权中心校验用户携带的token是否有效及是否有权限访问该api,由于没有此次访问未携带token,显然直接访问是没有权限的,因此需要先到鉴权中心申请token。

(2)访问https://localhost:5001/connect/token ,申请一个token
在这里插入图片描述
如图需要添加POST请求的body部分,参数类型选择x-www-form-urlencoded,如下

  • grant_type:client_credentials
  • client_id:client
  • client_secret:secret

参数key固定,value对应鉴权中中定义的Client的值,对应关系如下
在这里插入图片描述
申请到的token信息如下
在这里插入图片描述
(3)携带token请求api
在这里插入图片描述
请求结果,返回200状态码,则说明请求及认证成功
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z7kA1XMD-1647313784238)(http://192.168.1.88:4999/server/index.php?s=/api/attachment/visitFile&sign=400ae62e170645af39e20635b26084cc)]

三、新建测试客户端

1、新建ROC.Console.Client控制台项目,框架选择.net 6

在这里插入图片描述

2、添加IdentityModel Nuget包

在这里插入图片描述

3、获取发现文档

在Program.cs中添加以下代码

using IdentityModel.Client;

HttpClient client = new HttpClient();

//获取发现文档
DiscoveryDocumentResponse disco = await client.GetDiscoveryDocumentAsync("https://localhost:5001");
if (disco.IsError)
{
    Console.WriteLine(disco.Error);
    return;
}

4、获取token

在Program.cs中添加以下代码

//申请token
TokenResponse tokenResponse = await client.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest
{
    Address = disco.TokenEndpoint,
    ClientId = "client", //与鉴权中心Config.cs中 client定义的相同
    ClientSecret = "secret", //与鉴权中心Config.cs中 client定义的相同
    Scope = "api" //与鉴权中心Config.cs中 ApiScope定义的相同
});
if (tokenResponse.IsError)
{
    Console.WriteLine(tokenResponse.Error);
    return;
}
Console.WriteLine(tokenResponse.AccessToken);

5、请求webApi

在Program.cs中添加以下代码

//请求api
HttpClient apiClient = new HttpClient();
apiClient.SetBearerToken(tokenResponse.AccessToken);

var response = await apiClient.GetAsync("https://localhost:6001/Demo");
if (!response.IsSuccessStatusCode)
{
    Console.WriteLine(response.StatusCode);
}
else {
    var doc = JsonDocument.Parse(await response.Content.ReadAsStringAsync()).RootElement;
    Console.WriteLine(JsonSerializer.Serialize(doc, new JsonSerializerOptions { WriteIndented = true }));
}

完整代码
在这里插入图片描述

6、运行

在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值