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
相關文章
相關標籤/搜索