• IdentityServer4-端点


    一、发现端点

    二、授权端点

    三、令牌端点

    四、UserInfo端点

    五、Introspection端点

    六、撤销端点

    七、结束会话端点

    一、发现端点

    发现端点可用于检索有关IdentityServer的元数据 - 它返回诸如颁发者名称,密钥材料,支持的范围等信息。 

    发现端点可通过/.well-known/openid-configuration相对于基地址获得,例如:

    https://demo.identityserver.io/.well-known/openid-configuration

    IdentityModel

    您可以使用IdentityModel库以编程方式访问发现端点:

    var discoveryClient = new DiscoveryClient("https://demo.identityserver.io");
    var doc = await discoveryClient.GetAsync();
    
    var tokenEndpoint = doc.TokenEndpoint;
    var keys = doc.KeySet.Keys;

    出于安全原因,DiscoveryClient具有可配置的验证策略,默认情况下会检查以下规则:

    • HTTPS必须用于发现端点和所有协议端点
    • 发布者名称应该与下载文档时指定的权限相匹配(这实际上是发现规范中必须的)
    • 协议端点应该位于权限之下——而不是在不同的服务器或URL上(这对于多租户操作来说可能特别有趣)
    • 必须指定密钥集

    如果由于某种原因(例如开发环境)您需要放松设置,您可以使用以下代码:

    var client = new DiscoveryClient("http://dev.identityserver.internal");
    client.Policy.RequireHttps = false;
    
    var disco = await client.GetAsync();

    顺便说一句 - 你总是可以通过HTTP连接到localhost和127.0.0.1(但这也是可配置的)。

    二、授权端点

    授权端点可用于通过浏览器请求令牌或授权码。 此过程通常涉及最终用户的身份验证和可选的同意。 

    client_id 

    客户的标识符(必填)。

    scope 

    一个或多个注册范围(必填)

    redirect_uri 

    必须与该客户端允许的重定向URI之一完全匹配(必需)

    response_type 

      id_token  请求身份令牌(仅允许身份范围)

      token  请求访问令牌(仅允许资源范围)

      id_token token  请求身份令牌和访问令牌

      code 请求授权码

      code id_token  请求授权代码和身份令牌

      code id_token token  请求授权代码,身份令牌和访问令牌  

    response_mode 

      form_post  将令牌响应作为表单发送而不是片段编码重定向(可选)

    state 

    identityserver将回显令牌响应的状态值,这是客户端和提供者之间的往返状态,关联请求和响应以及CSRF /重放保护。 (推荐的)

    nonce 

    identityserver将回显身份令牌中的nonce值,这是为了重放保护)

    通过隐式授权对身份令牌是必需的。

    prompt     

       none  请求期间不会显示任何UI。 如果无法做到这一点(例如,因为用户必须登录或同意),则会返回错误

        login  即使用户已登录并具有有效会话,也会显示登录UI

    code_challenge 

    发送PKCE的代码质询

    code_challenge_method 

     plain plain表示使用纯文本 S256 S256表示使用SHA256进行哈希处理

    login_hint 

    可用于预先填写登录页面上的用户名字段

    ui_locales 

    提供有关登录UI所需显示语言的提示

    max_age 

    如果用户的登录会话超过最大时间(以秒为单位),将显示登录UI

    acr_values 

    允许传递额外的身份验证相关信息 - 身份服务器特殊情况下面的私有acr_values:

     idp:name_of_idp  绕过login / home领域屏幕并将用户直接转发到选定的身份提供者(如果允许每个客户端配置)

     tenant:name_of_tenant  可用于将租户名称传递给登录UI

    案例:

    GET /connect/authorize?
        client_id=client1&
        scope=openid email api1&
        response_type=id_token token&
        redirect_uri=https://myapp/callback&
        state=abc&
        nonce=xyz

    (删除了URL编码,并添加了换行符以提高可读性)

    IdentityModel

    您可以使用IdentityModel库以编程方式为授权端点创建URL:

    var request = new RequestUrl(doc.AuthorizeEndpoint);
    var url = request.CreateAuthorizeUrl(
        clientId:     "client",
        responseType: OidcConstants.ResponseTypes.CodeIdToken,
        responseMode: OidcConstants.ResponseModes.FormPost,
        redirectUri: "https://myapp.com/callback",
        state:       CryptoRandom.CreateUniqueId(),
        nonce:       CryptoRandom.CreateUniqueId());

    ..并解析响应:

    var response = new AuthorizeResponse(callbackUrl);
    
    var accessToken = response.AccessToken;
    var idToken = response.IdentityToken;
    var state = response.State;

    三、令牌端点

     令牌端点可用于以编程方式请求令牌。 它支持password,authorization_code,client_credentials和refresh_token grant types。 此外,可以扩展令牌端点以支持扩展授权类型。

    client_id

    客户标识符(必填)

    client_secret

    客户端密钥要么在post主体中,要么作为基本的身份验证头。

    grant_type

      authorization_codeclient_credentialspasswordrefresh_token or 自定义

    scope

    一个或多个注册范围。如果没有指定,将发出所有显式允许作用域的令牌。

    redirect_uri

    authorization_code授权类型所必需的

    code

    授权码(authorization_code授权类型所需)

    code_verifier

    PKCE证明密钥

    username

    资源所有者用户名(密码授权类型所需)

    password

    资源所有者密码(密码授权类型所需)

    acr_values

    允许传递密码授予类型的其他身份验证相关信息 - identityserver特殊情况下面的专有acr_values:

    idp:name_of_idp 绕过login / home领域屏幕并将用户直接转发到选定的身份提供者(如果允许每个客户端配置)

    tenant:name_of_tenant 可用于将租户名称传递给令牌端点

    refresh_token

    刷新令牌(refresh_token授权类型所需)

    案例

    POST /connect/token
    
        client_id=client1&
        client_secret=secret&
        grant_type=authorization_code&
        code=hdh922&
        redirect_uri=https://myapp.com/callback

    (为了便于阅读,删除了表格编码并添加了换行符)

    IdentityModel

    您可以使用IdentityModel库以编程方式访问令牌端点:

    var client = new TokenClient(
        doc.TokenEndpoint,
        "client_id",
        "secret");
    
    var response = await client.RequestAuthorizationCodeAsync("hdh922", "https://myapp.com/callback");
    var token = response.AccessToken;

    四、UserInfo端点

    UserInfo端点可用于检索有关用户的身份信息(请参阅规范)。 

    调用者需要发送代表用户的有效访问令牌。 根据授予的范围,UserInfo端点将返回映射的声明(至少需要openid作用域)。

    案例

    GET /connect/userinfo
    Authorization: Bearer <access_token>
    HTTP/1.1 200 OK
    Content-Type: application/json
    
    {
        "sub": "248289761001",
        "name": "Bob Smith",
        "given_name": "Bob",
        "family_name": "Smith",
        "role": [
            "user",
            "admin"
        ]
    }

    IdentityModel

    您可以使用IdentityModel库以编程方式访问userinfo端点:

    var userInfoClient = new UserInfoClient(doc.UserInfoEndpoint, token);
    
    var response = await userInfoClient.GetAsync();
    var claims = response.Claims;

    五、Introspection端点

    内省端点是RFC 7662的实现。 

    它可用于验证引用令牌(如果消费者不支持适当的JWT或加密库,则可以使用JWT)。 内省端点需要使用范围密钥进行身份验证。

    案例

    POST /connect/introspect
    Authorization: Basic xxxyyy
    
    token=<token>

    成功的响应将返回状态代码200以及活动或非活动令牌:

    {
        "active": true,
        "sub": "123"
    }

    未知或过期的令牌将被标记为无效:

    {
        "active": false,
    }

    无效请求将返回400,未授权请求401。

    IdentityModel

    您可以使用IdentityModel库以编程方式访问内省端点:

    var introspectionClient = new IntrospectionClient(
        doc.IntrospectionEndpoint,
        "api_name",
        "api_secret");
    
    var response = await introspectionClient.SendAsync(
        new IntrospectionRequest { Token = token });
    
    var isActive = response.IsActive;
    var claims = response.Claims;

    六、撤销端点

    此端点允许撤消访问令牌(仅限引用令牌)和刷新令牌。 它实现了令牌撤销规范(RFC 7009)。 

    token

    要撤销的令牌(必填)

    token_type_hint

    access_token或refresh_token(可选)

    案例

    POST /connect/revocation HTTP/1.1
    Host: server.example.com
    Content-Type: application/x-www-form-urlencoded
    Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
    
    token=45ghiukldjahdnhzdauz&token_type_hint=refresh_token

    IdentityModel

    您可以使用IdentityModel库以编程方式撤消令牌:

    var revocationClient = new TokenRevocationClient(
        RevocationEndpoint,
        "client",
        "secret");
    
    var response = await revocationClient.RevokeAccessTokenAsync(token);

    七、结束会话端点

     结束会话端点可用于触发单点注销(请参阅规范)。

    要使用结束会话端点,客户端应用程序会将用户的浏览器重定向到结束会话URL。 用户在会话期间通过浏览器登录的所有应用程序都可以参与注销。

    Parameters

    id_token_hint

    当用户被重定向到端点时,系统会提示他们是否真的想要注销。 发送从身份验证收到的原始id_token的客户端可以绕过此提示。 它作为名为id_token_hint的查询字符串参数传递。

    post_logout_redirect_uri

    如果传递了有效的id_token_hint,则客户端也可以发送post_logout_redirect_uriparameter。 这可用于允许用户在注销后重定向回客户端。 该值必须与客户端预先配置的PostLogoutRedirectUris(客户端文档)之一匹配。

    state

    如果传递了有效的post_logout_redirect_uri,则客户端也可以发送状态参数。 在用户重定向回客户端后,这将作为查询字符串参数返回给客户端。 这通常由客户端用于跨重定向的往返状态。

    案例

    GET /connect/endsession?id_token_hint=eyJhbGciOiJSUzI1NiIsImtpZCI6IjdlOGFkZmMzMjU1OTEyNzI0ZDY4NWZmYmIwOThjNDEyIiwidHlwIjoiSldUIn0.eyJuYmYiOjE0OTE3NjUzMjEsImV4cCI6MTQ5MTc2NTYyMSwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAwIiwiYXVkIjoianNfb2lkYyIsIm5vbmNlIjoiYTQwNGFjN2NjYWEwNGFmNzkzNmJjYTkyNTJkYTRhODUiLCJpYXQiOjE0OTE3NjUzMjEsInNpZCI6IjI2YTYzNWVmOTQ2ZjRiZGU3ZWUzMzQ2ZjFmMWY1NTZjIiwic3ViIjoiODg0MjExMTMiLCJhdXRoX3RpbWUiOjE0OTE3NjUzMTksImlkcCI6ImxvY2FsIiwiYW1yIjpbInB3ZCJdfQ.STzOWoeVYMtZdRAeRT95cMYEmClixWkmGwVH2Yyiks9BETotbSZiSfgE5kRh72kghN78N3-RgCTUmM2edB3bZx4H5ut3wWsBnZtQ2JLfhTwJAjaLE9Ykt68ovNJySbm8hjZhHzPWKh55jzshivQvTX0GdtlbcDoEA1oNONxHkpDIcr3pRoGi6YveEAFsGOeSQwzT76aId-rAALhFPkyKnVc-uB8IHtGNSyRWLFhwVqAdS3fRNO7iIs5hYRxeFSU7a5ZuUqZ6RRi-bcDhI-djKO5uAwiyhfpbpYcaY_TxXWoCmq8N8uAw9zqFsQUwcXymfOAi2UF3eFZt02hBu-shKA&post_logout_redirect_uri=http%3A%2F%2Flocalhost%3A7017%2Findex.html
    Next  Previous
  • 相关阅读:
    开源操作系统发行版特性学习
    ssar
    OpenEuler特性学习 —— 统一共享内存 (share_pool)
    OpenEuler特性学习 —— Limit Pagecache
    oomd、lmkd与PSI
    使用git rebase onto一例
    Alibaba Cloud Linux 资源隔离及混部技术
    sysAK
    walk_tg_tree_from的图解
    编译ubuntu内核
  • 原文地址:https://www.cnblogs.com/zd1994/p/9265003.html
Copyright © 2020-2023  润新知