IdentityServer4深入使用(四)-- IdentityServer4 的使用

本文介绍如何使用IdentityServer4实现OAuth2.0及OpenID Connect认证授权。涵盖安装配置、密码认证、OIDC认证等关键步骤。

原文地址: https://www.jeremyjone.com/795/,转载请注明。


开始之前

更多学习内容,可以看我的 .NET 学习之路系列-IdentityServer4 的使用,持续更新中。

正文开始

IdentityServer4 是基于 OpenId Connect(OIDC)、OAuth 2.0 统一的身份认证和授权系统。它拥有很多功能:

  • 保护你的资源
  • 使用本地帐户或通过外部身份提供程序对用户进行身份验证
  • 提供会话管理和单点登录
  • 管理和验证客户机
  • 向客户发出标识和访问令牌
  • 验证令牌

OpenId Connect(OIDC)

OpenId 是一种认证机制,用于对用于的身份进行认证,它允许用户使用单个账号登录多个网站。

OIDC 提供者必须记录其将哪些声明包含在其标识令牌中,有关认证的必须声明:

  • aud(读者):必须包含在发行者注册的 RP 的客户机标识
  • iss(发行者):OP 的发行者标识
  • exp(到期时间):RP 必须再次时间之前验证标识令牌
  • iat(发行时间):发放标识令牌的时间

以下声明是有关用户的必须声明:

  • sub(主题):发行者的用户的本地唯一且永久标识

OAuth 2.0

OAuth 2.0 是一种授权机制,主要用于颁发令牌。

举个例子
你入职了一家公司,HR 小姐姐给了你一张门禁卡,你通过门禁卡就可以进入公司。但不一定每一间屋子都能进。-- 这就相当于颁发访问令牌。
非本公司的人没有门禁卡,他们就进不来。而你拿着这张门禁卡在公司到处溜达,不见得每个门都能打开,比如老总办公室。-- 这就是权限控制。
当你离职的时候,HR 小姐姐会收回你的门禁卡,你也就进不了公司了,这就是授权过期。

OAuth 2.0 规定了四中获得令牌的流程:

  • 授权码(authorization-code)
  • 隐藏式(implicit)
  • 密码式(password)
  • 客户端凭证(client-credentials)

1、授权码:

即客户先申请一个授权,然后再用该授权码获取令牌。这种方式最常用,安全性也最高。

因为发送参数通常都在 URL 中,并且 secret 参数是保密的,所以一定要在后端发送请求。

2、隐藏式:

即允许直接向前端颁发令牌,没有授权码的步骤。

因为随着前后端分离,大量纯前端项目的出现,导致授权码的方式在一定程度上不能实行,所以必须将令牌存储在前端,于是就有了隐藏式。

这种方式很不安全,所以只用于特定安全要求不高的环境下,并且有效期应该设置的尽量短。而且,这种回调的跳转参数通常使用锚点形式。

3、密码式:

即通过某个第三方应用输入密码进行验证,并由该应用向目标服务器请求令牌。

这种方式要求客户完全信赖其使用的第三方应用,否则不应该将密码告诉它们。

4、客户端凭证:

该方案适用于命令行应用。这种方式给出的令牌是针对第三方应用的,而非针对用户,所以可能多个用户使用同一令牌。

无论哪种方式,客户(第三方应用)都应在申请令牌之前进行系统备案,说明自己的身份,然后才会拿到两个身份识别码:

  • 客户端 Id(client ID)
  • 客户端秘钥(client secret)

没有备案的客户,是不会拿到令牌的。

创建 IS4 服务

IS4 官方教程:英文文档

具体代码可以看 示例代码

安装 IS4 包

通过 NuGet 管理器安装 IdentityServer4

添加配置文件

添加一个 Config.cs 文件,并且添加如下内容:

public static class Config
{
   
   
    /// <summary>
    /// 配置认证资源信息
    /// </summary>
    public static IEnumerable<IdentityResource> Ids =>
        new IdentityResource[]
        {
   
   
            // 认证资源,OpenId 是必须要添加的
            new IdentityResources.OpenId(),
            // Profile 也是需要带上的
            new IdentityResources.Profile()
        };

    /// <summary>
    /// 配置 Api 信息
    /// </summary>
    public static IEnumerable<ApiScope> Apis =>
        new[]
        {
   
   
            new ApiScope("api.jeremyjone.com", "Jz.Api"),
        
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值