IdentityServer4 是一个基于 .NET Core 的 OpenID Connect 实现框架。

基于框架创建可运行的应用,通常还需要多个步骤,添加引用、配置项目、框架初始化、按照一系列步骤启动应用等等。那么,基于 IdentityServer4 创建一个可运行的 OpenID Connect 服务器需要多少行代码呢?

得益于 .net core 提供的项目模版支持,实际上,不需要你写一行代码,只需要执行几个简单的命令就可以了。

1. 准备 IdentityServer4 模版

还记得使用 .net core 的命令行工具 dotnet 创建项目使用的 new 命令吗?如果你希望创建名为 HelloWorld 的项目,那么,创建它的命令如下:

dotnet new console -n HelloWorld

该命令会在当前目录下创建 HelloWorld 子目录。命令执行完成之后,进入这个 HelloWorld 目录中,就可以通过 run 命令来运行了。

>cd HelloWorld
>dotnet run
Hello World!

这个 console 就是通过内置的模版来实现的。当前支持的模版可以通过 list 子命令列出

dotnet new -list

在 dotnet 中,还可以通过 -i 参数来安装新的模版。模版既可以通过一个路径提供,也可以通过一个 nuget_id 来提供。你可能已经想到了,IdentityServer4 就已经提供了一个预定义在 NuGet 中的模版:IdentityServer4.Templates,你可以直接在 NuGet 中找到它:https://www.nuget.org/packages/IdentityServer4.Templates。需要说明的是,同一个项目模版可能存在多个版本,在安装的时候,可以通过在模版名称后面使用两个冒号来分隔特定的版本号,默认情况下,只安装最新的稳定版本。

所以,事情变得简单了。我们需要的就是先在本地安装这个模版,然后,使用这个模版就可以直接创建出完整的 IdentityServer4 项目,然后直接运行。

dotnet new --install IdentityServer4.Templates

NuGet 中的提示是安装特定的版本,现在的最新稳定版本是 3.1.1,所以命令变成了

dotnet new --install IdentityServer4.Templates::3.1.1

在命令的输出中,可以看到已经安装了多个关于 IdentityServer4 的模版

Templates Short Name Language Tags
IdentityServer4 with AdminUI is4admin [C#] Web/IdentityServer4
IdentityServer4 with ASP.NET Core Identity is4aspid [C#] Web/IdentityServer4
IdentityServer4 Empty is4empty [C#] Web/IdentityServer4
IdentityServer4 with Entity Framework Stores is4ef [C#] Web/IdentityServer4
IdentityServer4 with In-Memory Stores and Test Users is4inmem [C#] Web/IdentityServer4
IdentityServer4 Quickstart UI (UI assets only) is4ui [C#] Web/IdentityServer4

这里面最为简单的项目模版就是 IdentityServer4 Empty 了,它简称为 is4empty ,我们下面就使用它来创建项目。

2. 创建第一个 IdentityServer4 项目

直接使用 .net core 的 new 命令来创建项目,我们将创建的项目命名为 IdentityServer

dotnet new is4empty -n IdentityServer

执行之后,会在当前目录下创建 IdentityServer 文件夹,所有的项目文件都位于其中。

3. 启动应用

使用 .net core 的 run 命令来启动项目,可以看到如下输出:

dotnet new is4empty -n IdentityServer
PS C:\temp\is4\IdentityServer> dotnet run
[19:34:49 Information]
Starting host...

[19:34:50 Information] IdentityServer4.Startup
Starting IdentityServer4 version 3.1.0.0

[19:34:50 Information] IdentityServer4.Startup
You are using the in-memory version of the persisted grant store. This will store consent decisions, authorization codes, refrtion.

[19:34:50 Information] IdentityServer4.Startup
Using the default authentication scheme idsrv for IdentityServer

[19:34:50 Debug] IdentityServer4.Startup
Using idsrv as default ASP.NET Core scheme for authentication

[19:34:50 Debug] IdentityServer4.Startup
Using idsrv as default ASP.NET Core scheme for sign-in

[19:34:50 Debug] IdentityServer4.Startup
Using idsrv as default ASP.NET Core scheme for sign-out

[19:34:50 Debug] IdentityServer4.Startup
Using idsrv as default ASP.NET Core scheme for challenge

[19:34:50 Debug] IdentityServer4.Startup
Using idsrv as default ASP.NET Core scheme for forbid

祝贺你!你已经成功创建了第一个可运行的 IdentityServer4 服务器!

4. 访问配置信息

虽然还没有写一行代码,但是,服务器已经在工作了,我们可以通过它的 .well-known 端点来访问服务器的配置信息,在浏览器的地址栏中,输入地址:http://localhost:5000/.well-known/openid-configuration,并回车。应该可以看到如下的响应信息。

{
"issuer": "http://localhost:5000",
"jwks_uri": "http://localhost:5000/.well-known/openid-configuration/jwks",
"authorization_endpoint": "http://localhost:5000/connect/authorize",
"token_endpoint": "http://localhost:5000/connect/token",
"userinfo_endpoint": "http://localhost:5000/connect/userinfo",
"end_session_endpoint": "http://localhost:5000/connect/endsession",
"check_session_iframe": "http://localhost:5000/connect/checksession",
"revocation_endpoint": "http://localhost:5000/connect/revocation",
"introspection_endpoint": "http://localhost:5000/connect/introspect",
"device_authorization_endpoint": "http://localhost:5000/connect/deviceauthorization",
"frontchannel_logout_supported": true,
"frontchannel_logout_session_supported": true,
"backchannel_logout_supported": true,
"backchannel_logout_session_supported": true,
"scopes_supported": [
"openid",
"offline_access"
],
"claims_supported": [
"sub"
],
"grant_types_supported": [
"authorization_code",
"client_credentials",
"refresh_token",
"implicit",
"urn:ietf:params:oauth:grant-type:device_code"
],
"response_types_supported": [
"code",
"token",
"id_token",
"id_token token",
"code id_token",
"code token",
"code id_token token"
],
"response_modes_supported": [
"form_post",
"query",
"fragment"
],
"token_endpoint_auth_methods_supported": [
"client_secret_basic",
"client_secret_post"
],
"id_token_signing_alg_values_supported": [
"RS256"
],
"subject_types_supported": [
"public"
],
"code_challenge_methods_supported": [
"plain",
"S256"
],
"request_parameter_supported": true
}

5. 查看项目代码

5.1 项目文件

项目文件名称为 IdentityServer4.csproj,内容如下:

<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup> <ItemGroup>
<PackageReference Include="IdentityServer4" Version="3.1.0" />
<PackageReference Include="Serilog.AspNetCore" Version="3.2.0" />
<!-- <PackageReference Include="System.Security.Principal.Windows" Version="4.7.0" /> -->
</ItemGroup>
</Project>

主要做了 3 件事:

  • 配置了项目为 Web 应用项目,通过 Sdk 属性指定了 Microsoft.NET.Sdk.Web,目标框架为 .net core 3.1。

  • 添加了对 IdentityServer4 的引用,这就是 IdentityServer4 的实现库

  • 添加了日志库 Serilog.AspNetCore

5.2 Program.cs

这里面相当多的代码是关于 Serilog 日志的配置,关于 Web 站点,只是使用了标准的 Startup 方式启动。

// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.


using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using Serilog;
using Serilog.Events;
using Serilog.Sinks.SystemConsole.Themes;
using System;

namespace IdentityServer
{
public class Program
{
public static int Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
.MinimumLevel.Override("System", LogEventLevel.Warning)
.MinimumLevel.Override("Microsoft.AspNetCore.Authentication", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.Console(outputTemplate: "[{Timestamp:HH:mm:ss} {Level}] {SourceContext}{NewLine}{Message:lj}{NewLine}{Exception}{NewLine}", theme: AnsiConsoleTheme.Literate)
.CreateLogger();

try
{
Log.Information("Starting host...");
CreateHostBuilder(args).Build().Run();
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly.");
return 1;
}
finally
{
Log.CloseAndFlush();
}
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
webBuilder.UseSerilog();
});
}
}

5.3 Startup.cs

在 ConfigureServices() 中,最为关键的一行就是添加了 IdentityServer4 服务的支持。

由于这是用于演示的空项目,所以,具体的 OpenID Connect 配置信息来自于一个代码文件 Config,并使用硬编码的方式来用于 IdentityServer

var builder = services.AddIdentityServer()
.AddInMemoryIdentityResources(Config.Ids)
.AddInMemoryApiResources(Config.Apis)
.AddInMemoryClients(Config.Clients);

这个 Config.cs 文件中,还没有对这些信息进行配置。

// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.


using IdentityServer4.Models;
using System.Collections.Generic;

namespace IdentityServer
{
public static class Config
{
public static IEnumerable<IdentityResource> Ids =>
new IdentityResource[]
{
new IdentityResources.OpenId()
};

public static IEnumerable<ApiResource> Apis =>
new ApiResource[]
{ }; public static IEnumerable<Client> Clients =>
new Client[]
{ }; }
}

在 Configure() 中,则启用了 IdentityServer 服务。

app.UseIdentityServer();

完整的代码如下所示:

// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.


using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace IdentityServer
{
public class Startup
{
public IWebHostEnvironment Environment { get; }

public Startup(IWebHostEnvironment environment)
{
Environment = environment;
}

public void ConfigureServices(IServiceCollection services)
{
// uncomment, if you want to add an MVC-based UI
//services.AddControllersWithViews();

var builder = services.AddIdentityServer()
.AddInMemoryIdentityResources(Config.Ids)
.AddInMemoryApiResources(Config.Apis)
.AddInMemoryClients(Config.Clients);

// not recommended for production - you need to store your key material somewhere secure
builder.AddDeveloperSigningCredential();
}

public void Configure(IApplicationBuilder app)
{
if (Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}

// uncomment if you want to add MVC
//app.UseStaticFiles();
//app.UseRouting();

app.UseIdentityServer();

// uncomment, if you want to add MVC
//app.UseAuthorization();
//app.UseEndpoints(endpoints =>
//{
// endpoints.MapDefaultControllerRoute();
//});
}
}
}

参考资料

IdentityServer4 快速上手的更多相关文章

  1. 【Python五篇慢慢弹】快速上手学python

    快速上手学python 作者:白宁超 2016年10月4日19:59:39 摘要:python语言俨然不算新技术,七八年前甚至更早已有很多人研习,只是没有现在流行罢了.之所以当下如此盛行,我想肯定是多 ...

  2. 快速上手Unity原生Json库

    现在新版的Unity(印象中是从5.3开始)已经提供了原生的Json库,以前一直使用LitJson,研究了一下Unity用的JsonUtility工具类的使用,发现使用还挺方便的,所以打算把项目中的J ...

  3. [译]:Xamarin.Android开发入门——Hello,Android Multiscreen快速上手

    原文链接:Hello, Android Multiscreen Quickstart. 译文链接:Hello,Android Multiscreen快速上手 本部分介绍利用Xamarin.Androi ...

  4. [译]:Xamarin.Android开发入门——Hello,Android快速上手

    返回索引目录 原文链接:Hello, Android_Quickstart. 译文链接:Xamarin.Android开发入门--Hello,Android快速上手 本部分介绍利用Xamarin开发A ...

  5. 快速上手seajs——简单易用Seajs

    快速上手seajs——简单易用Seajs   原文  http://www.cnblogs.com/xjchenhao/p/4021775.html 主题 SeaJS 简易手册 http://yslo ...

  6. Git版本控制Windows版快速上手

    说到版本控制,之前用过VSS,SVN,Git接触不久,感觉用着还行.写篇博文给大家分享一下使用Git的小经验,让大家对Git快速上手. 说白了Git就是一个控制版本的工具,其实没想象中的那么复杂,咱在 ...

  7. Objective-C快速上手

    最近在开发iOS程序,这篇博文的内容是刚学习Objective-C时做的笔记,力图达到用最短的时间了解OC并使用OC.Objective-C是OS X 和 iOS平台上面的主要编程语言,它是C语言的超 ...

  8. Netron开发快速上手(二):Netron序列化

    Netron是一个C#开源图形库,可以帮助开发人员开发出类似Visio的作图软件.本文继前文”Netron开发快速上手(一)“讨论如何利用Netron里的序列化功能快速保存自己开发的图形对象. 一个用 ...

  9. Netron开发快速上手(一):GraphControl,Shape,Connector和Connection

    版权所有,引用请注明出处:<<http://www.cnblogs.com/dragon/p/5203663.html >> 本文所用示例下载FlowChart.zip 一个用 ...

  10. NHibernate3快速上手教程FluentNHibernate配置与DBHelper

    很多学习NHibernate的新手很容易卡在配置文件这一关,正所谓万事开头难,上手后再配合官方文档就比较容易了. 网上关于配置文件的资料非常多,但由于版本的问题,许多老的教程中都没有明确指出类库的版本 ...

随机推荐

  1. Genuine Intel(R) CPU型号

    起因: 在盘点固定资产的时候,发现有一台电脑CPU不显示具体型号,而是 英特尔 @ 2.60GHz (X2) ,通过主板型号来判断是至强系列的CPU,后经软件识别为 Genuine ,然后去查资料才了 ...

  2. 《Cloudera Hadoop大数据平台实战指南》代码下载

    <Cloudera Hadoop大数据平台实战指南>代码下载 本书图书资源下载地址链接:https://pan.baidu.com/s/1-P7Go5gdJLim33_Iju1rfg 提取 ...

  3. 单Master节点的k8s集群部署-完整版

    K8S 安装步骤 一.准备工作 1.准备三台主机(一台Master节点,两台Node节点)如下: 角色 IP 内存 核心 磁盘 Master 192.168.116.131 4G 4个 55G Nod ...

  4. 深度学习 - Torch-TensorRT 推理加速

    深度学习 - Torch-TensorRT 推理加速 Torch-TensorRT 作为 TorchScript 的扩展. 它优化并执行兼容的子图,让 PyTorch 执行剩余的图. PyTorch ...

  5. dotnet 冒泡排序

    // See https://aka.ms/new-console-template for more information using ConsoleApp1; Console.WriteLine ...

  6. 我们如何在 vue 应用我们的权限

    权限可以分为用户权限和按钮权限: 用户权限,让不同的用户拥有不同的路由映射 ,具体实现方法: 1. 初始化路由实例的时候,只把静态路由规则注入 ,不要注入动态路由规则 : 2. 用户登录的时候,根据返 ...

  7. fiddler限速配置&mock配置

    一.限速配置 1.开启性能选项 2.找到对应的参数入口 3.修改对应的从参数 解释下 这2个参数是如何做到限速的 4.request-trickle-delay(上传数据限制) 默认值是300,他的意 ...

  8. DRF-Throttle组件源码分析及改编源码

    1. 限流组件源码分析 注意:以下源码为方便理解已进行简化,只保留了与限流组件相关的代码.注释前的数字代表执行顺序. SimpleRateThrottle类的源码解析: 2. 实践:编写一个限流类 f ...

  9. .net 在线客服系统,到底能不能处理 50万 级消息量,系统架构实践

    业余时间用 .net core 写了一个在线客服系统.我把这款业余时间写的小系统丢在网上,陆续有人找我要私有化版本,我都给了,毕竟软件业的初衷就是免费和分享. 后来我索性就发了一个100%私有化版直接 ...

  10. 搞人工智能开源大语言模型GPT2、Llama的正确姿势

    (如果想及时收到人工智能相关的知识更新,请点击关注!!) 序言:目前我们每一小节的内容都讲解得非常慢,因为这是人工智能研发中的最基础知识.如果我们不能扎实掌握这些知识,将很难理解后续更复杂且实用的概念 ...