zoukankan      html  css  js  c++  java
  • .NET 云原生架构师训练营(Identity Server)--学习笔记

    目录

    • OAuth 2.0
    • OpenID Connect
    • QuickStart

    OAuth 2.0

    • 概念
    • 过程
    • 通信
    • 组件
    • 示例代码

    概念

    OAuth 2.0 是一个授权协议,它允许软件应用代表(而不是充当)资源拥有者去访问资源拥有者的资源(如何让一个系统组件获取另一个系统组件的访问权限)

    • 受保护的资源:是资源拥有者有权限访问的组件
    • 资源拥有者:有权访问 API,并能将 API 访问权限委托出去
    • 客户端:凡是使用了受保护资源上的 API,都是客户端

    过程

    通信

    组件

    • 访问令牌 token
    • 权限范围 scope
    • 刷新令牌 refresh token
    • 授权许可 grant_type
    grant_type 授权方式 授权前置条件 使用通信信道 说明
    authorization_code/PKCE 授权码模式 授权码 前端/后端 客户端通过code在后端与授权服务器进行交互获取令牌
    implict(不建议使用) 简化模式
    password(不建议使用) 密码模式 用户名/密码 后端 在客户端输入用户名和密码,由客户端向授权服务器获取令牌
    client_credentials 客户端模式 后端
    device_code 设备码
    refresh_token 刷新token 用refresh_token来换取新的token

    授权码模式

    1. 第三方应用首先向服务提供商申请 client_id 应用唯一标识、Client_secret 密钥,用于后续获取令牌时提供身份校验

    2. 申请授权码:此时要提供预分配好的 client_id 标识来源,提供 scope 标识要申请的权限,提供 redirect_uri 标识授权完毕后要回跳的第三方应用链接

    3. 第一次 302 重定向:认证服务器展示登录授权页

    4. 第二次 302 重定向:在用户提交授权,认证服务器认证成功后,会分配授权码 code,并重定向回第三方应用的 redirect_uri

    5. (建议第三方应用要根据当前用户会话生成随机且唯一的 state 参数,并且收到授权码时先进行校验,避免 CSRF 攻击)最后,第三方应用会向认证服务器申请令牌 access_token,此时要提供预分配好的 code、client_id、client_secret 以便认证。这一步是在后端之间完成的,对用户不可见。access_token 是有有效期的,过期后需要刷新

    6. 拿到令牌 access_token 后,第三方应用就可以访问资源方,获取所需资源 access_token 相当于用户的 session id

    选择正确的许可类型

    示例代码

    地址:https://github.com/skoruba/IdentityServer4.Admin

    OpenID Connect

    • OAuth2.0 的不足之处
    • OIDC 概念

    OAuth2.0 的不足之处

    OAuth2.0 中的 access_token 就是酒店的房卡,谁都可以拥有房卡,有房卡就可以打开酒店的门,但是房卡上并没有当前使用房卡的用户信息,如果需要知道当前房卡所有人的信息需要单独再向酒店的前台去询问

    OIDC 概念

    Open ID Connect 1.0 是建立在 OAuth 2.0 之上的一个身份层

    https://openid.net/specs/openid-connect-core-1_0.html#ImplicitAuthorizationEndpoint

    QuickStart

    安装模板

    dotnet new -i IdentityServer4.Templates
    

    查看模板

    dotnet new
    

    使用模板创建

    dotnet new is4inmem -n QuickStart
    
    已成功创建模板“IdentityServer4 with In-Memory Stores and Test Users”。
    

    打开项目,启动

    点击进入登录页面,使用默认用户登录

    登录结果

    根据配置文件通过ClientCredentials的方式获取token

    // m2m client credentials flow client
    new Client
    {
        ClientId = "m2m.client",
        ClientName = "Client Credentials Client",
    
        AllowedGrantTypes = GrantTypes.ClientCredentials,
        ClientSecrets = { new Secret("511536EF-F270-4058-80CA-1C89C192F69A".Sha256()) },
    
        AllowedScopes = { "scope1" }
    },
    

    根据配置文件通过Code的方式获取token

    // interactive client using code flow + pkce
    new Client
    {
        ClientId = "interactive",
        ClientSecrets = { new Secret("49C1A7E1-0C79-4A89-A3D6-A37998FB86B0".Sha256()) },
        
        AllowedGrantTypes = GrantTypes.Code,
        RequirePkce = false,
        AllowPlainTextPkce = true,
    
        RedirectUris = { "https://localhost:44300/signin-oidc" },
        FrontChannelLogoutUri = "https://localhost:44300/signout-oidc",
        PostLogoutRedirectUris = { "https://localhost:44300/signout-callback-oidc" },
    
        AllowOfflineAccess = true,
        AllowedScopes = { "openid", "profile", "scope2" }
    },
    

    访问认证接口获取授权码

    https://localhost:5001/connect/authorize?client_id=interactive&scope=openid&response_type=code&redirect_uri=https://localhost:44300/signin-oidc&nonce=xyz
    

    返回授权码

    https://localhost:44300/signin-oidc?code=BC56FE53D39BD46A5D55D43F485E23D7FF6583FEDD7A2A0B7A2A3DFDF5C52935&scope=openid&session_state=SwfB-jWoQ16C67cm5c_ANqbVE1R50Krj55GuJuArEQ0.BE30A11CD461DC430C5121AEFB4A4E82
    

    课程链接

    https://appsqsyiqlk5791.h5.xiaoeknow.com/v1/course/video/v_5f39bdb8e4b01187873136cf?type=2

    知识共享许可协议

    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

    欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。

    如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。

  • 相关阅读:
    Java Web开发 之VO、PO、DTO等收集
    Hive的安装与使用
    各种默认回车提交表单
    A/B Problem
    A+B Problem II
    A+B Problem IV
    关于521
    劝你别做
    无主之地1
    A+B Problem(V)
  • 原文地址:https://www.cnblogs.com/MingsonZheng/p/14961479.html
Copyright © 2011-2022 走看看