1、發現端點html
2、受權端點編程
3、令牌端點json
4、UserInfo端點api
6、撤銷端點安全
7、結束會話端點服務器
發現端點可用於檢索有關IdentityServer的元數據 - 它返回諸如頒發者名稱,密鑰材料,支持的範圍等信息。 app
發現端點可經過/.well-known/openid-configuration相對於基地址得到,例如:dom
https://demo.identityserver.io/.well-known/openid-configuration
您可使用IdentityModel庫以編程方式訪問發現端點:
var discoveryClient = new DiscoveryClient("https://demo.identityserver.io"); var doc = await discoveryClient.GetAsync(); var tokenEndpoint = doc.TokenEndpoint; var keys = doc.KeySet.Keys;
出於安全緣由,DiscoveryClient具備可配置的驗證策略,默認狀況下會檢查如下規則:
若是因爲某種緣由(例如開發環境)您須要放鬆設置,您可使用如下代碼:
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庫以編程方式爲受權端點建立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_code
, client_credentials
, password
, refresh_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庫以編程方式訪問令牌端點:
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端點將返回映射的聲明(至少須要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庫以編程方式訪問userinfo端點:
var userInfoClient = new UserInfoClient(doc.UserInfoEndpoint, token); var response = await userInfoClient.GetAsync(); var claims = response.Claims;
內省端點是RFC 7662的實現。
它可用於驗證引用令牌(若是消費者不支持適當的JWT或加密庫,則可使用JWT)。 內省端點須要使用範圍密鑰進行身份驗證。
案例
POST /connect/introspect
Authorization: Basic xxxyyy
token=<token>
成功的響應將返回狀態代碼200以及活動或非活動令牌:
{ "active": true, "sub": "123" }
未知或過時的令牌將被標記爲無效:
{ "active": false, }
無效請求將返回400,未受權請求401。
您可使用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庫以編程方式撤消令牌:
var revocationClient = new TokenRevocationClient( RevocationEndpoint, "client", "secret"); var response = await revocationClient.RevokeAccessTokenAsync(token);
結束會話端點可用於觸發單點註銷(請參閱規範)。
要使用結束會話端點,客戶端應用程序會將用戶的瀏覽器重定向到結束會話URL。 用戶在會話期間經過瀏覽器登陸的全部應用程序均可以參與註銷。
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