IdentityServer4-端点

1、发现端点html

2、受权端点编程

3、令牌端点json

4、UserInfo端点api

5、Introspection端点浏览器

6、撤销端点安全

7、结束会话端点服务器

1、发现端点session

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

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

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(但这也是可配置的)。

 

2、受权端点

受权端点可用于经过浏览器请求令牌或受权码。 此过程一般涉及最终用户的身份验证和可选的赞成。 

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;

 

3、令牌端点

 令牌端点可用于以编程方式请求令牌。 它支持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;

 

4、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;

 

5、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;

 

6、撤销端点

此端点容许撤消访问令牌(仅限引用令牌)和刷新令牌。 它实现了令牌撤销规范(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);

 

7、结束会话端点

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

要使用结束会话端点,客户端应用程序会将用户的浏览器重定向到结束会话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