IdentityServer4 中文文檔 -11- (快速入門)添加基於 OpenID Connect 的用戶認證

来源:http://www.cnblogs.com/ideck/archive/2017/08/08/ids_quickstarts_11.html
-Advertisement-
Play Games

IdentityServer4 是一個提供 認證服務,單點登錄/登出(SSO),API訪問控制,聯合認證通道的可定製、免費商業支持的框架。 ...


IdentityServer4 中文文檔 -11- (快速入門)添加基於 OpenID Connect 的用戶認證


原文:http://docs.identityserver.io/en/release/quickstarts/3_interactive_login.html

上一篇:IdentityServer4 中文文檔 -10- (快速入門)使用密碼保護API
下一篇:IdentityServer4 中文文檔 -12- (快速入門)添加外部認證支持

在這個快速啟動中,我們希望通過OpenID Connect協議向我們的 IdentityServer 添加對互動式用戶身份驗證的支持。

完成之後,我們將創建一個使用 IdentityServer 進行身份認證的 MVC 應用程式。

添加 UI(用戶界面)

IdentityServer 內置了 OpenID Connect 需要的所有協議支持。你需要提供必需的 UI 部分,包括 登錄、註銷、授權確認以及錯誤頁。

因為在每個 IdentityServer 的實現中,視覺、感覺以及實際工作流可能總是有所不同的,所以我們提供了一套基於 MVC 的樣例 UI,你可以將其作為啟動點來使用。

這套 UI 可以在 快速入門倉庫 找到。你還可以克隆或下載這個倉庫,將其中的控制器、視圖、模型以及 CSS 放到你的 Web 應用程式中。

你還可以在你的 Web 應用程式中以命令行的方式運行以下命令來自動下載:

iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/IdentityServer/IdentityServer4.Quickstart.UI/release/get.ps1'))

查看 自述文件 以瞭解更多 快速入門UI 相關的信息。

註意: UI 倉庫的 release 分支擁有與最新發佈的穩定版相匹配的 UI。dev 分支則與 IdentityServer4 的當前開發構建相符。如果你想要尋找指定版本的 UI,請查看相應的標簽。

花一些時間去查閱控制器和模型,你越是瞭解他們,將來要修改他們就越簡單。大部分代碼都以“功能目錄”的樣式放在 “Quickstart” 文件夾下,如果這種樣式不適合你,那就按照你想要的方式隨意組織代碼。

創建一個 MVC 客戶端

接下來你將向解決方案添加一個 MVC 應用程式,可以使用 ASP.NET Core "Web 應用程式" 模板來實現。 將應用程式配置為使用 5002 埠(可以查看概覽部分以瞭解如何配置)。

為了能向 MVC 應用程式添加 OpenID Connect 認證支持,請添加如下 NuGet 程式包:

  • Microsoft.AspNetCore.Authentication.Cookies
  • Microsoft.AspNetCore.Authentication.OpenIdConnect

然後添加這兩個中間件到你的管道中 —— Cookies 對應的中間件很簡單:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationScheme="Cookies"
});

OpenID Connect 中間件需要稍微多一些配置。將它指向 Identity Server,指定一個客戶端 ID 並且告訴它哪個中間件將會負責本地登陸(也就是 cookies 中間件)。此外,我們關閉了 JWT 身份信息類型映射,這樣就允許 well-known 身份信息(比如,“sub” 和 “idp”) 無干擾地流過。這個身份信息類型映射的 “清理” 必須在調用 UseOpenIdConnectAuthentication() 之前完成:

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
{
    AuthenticationScheme = "oidc",
    SignInScheme = "Cookies",
    Authority = "http://localhost:5000",
    RequireHttpsMetadata = false,
    ClientId = "mvc",
    SaveTokens = true
});

兩個中間件都應該在 MVC 之前添加到管道。

下一個步驟是觸發認證握手,為此打開 home 控制器並添加 [Authorize] 到其中一個 action 上。另外,修改 action 對應的視圖以顯示用戶的身份信息,比如:

<dl>
    @foreach (var claim in User.Claims)
    {
        <dt>@claim.Type</dt>
        <dd>@claim.Value</dd>
    }
</dl>

現在,如果你使用瀏覽器導航到上述控制器,一個Mvc客戶端將視圖重定向到 IdentityServer - 這會導致錯誤,因為 MVC 客戶端還沒有註冊(在 IdentityServer 上定義)呢。

添加 OpenID Connect 身份 Scopes 支持

與 OAuth 2.0 相似,OpenID Connect 也使用 scopes 這個概念。再一次說明,Scopes 表示你想要保護的和客戶端想要訪問的事物。在與 OAuth 相比,OIDC(OpenID Connect) 中的 scopes 不僅代表 API,還代表了諸如 用戶id、用戶名 或 郵箱地址等身份數據。

通過(在 Config.cs 中)添加新的幫助器來創建 IdentityResource 對象的集合,可以添加對標準 openid(subject id,這裡指的是用戶id)和 profile(姓氏,名稱 等等)等 scopes 的支持:

public static IEnumerable<IdentityResource> GetIdentityResources()
{
    return new List<IdentityResource>
    {
        new IdentityResources.OpenId(),
        new IdentityResources.Profile(),
    };
}

註意:所有標準的 Scopes 和他們對應的 身份信息 都可以在 OpenID Connect 規範 中找到。

接下來在 Startup.cs 中你要將這些身份資源添加到你的 IdentityServer 配置。在你調用 AddIdentityServer() 的地方使用 AddInMemoryIdentityResources 擴展方法即可:

public void ConfigureServices(IServiceCollection services)
{
    // 使用記憶體存儲,密鑰,客戶端和資源來配置身份伺服器。
    services.AddIdentityServer()
        .AddTemporarySigningCredential()
        .AddInMemoryApiResources(Config.GetApiResources())
        .AddInMemoryClients(Config.GetClients())
        .AddTestUsers(Config.GetUsers())
        .AddInMemoryIdentityResources(Config.GetIdentityResources());
}

為 OIDC 隱式流添加客戶端定義

最後一個步驟是為 IdentityServer 添加一個新的客戶端。

目前,我們添加的基於 OIDC 的客戶端與 OAuth 2.0 客戶端非常相似。但是由於 OIDC 中的流總是互動式的,所以我們需要添加一些重定向 URL 到我們的配置中。

添加以下代碼到你的客戶端配置中:

public static IEnumerable<Client> GetClients()
{
    return new List<Client>
    {
        // 省略的客戶端...

        // OIDC 隱式流客戶端(MVC)
        new Client
        {
            ClientId = "mvc",
            ClientName = "Mvc 客戶端",
            AllowedGrantTypes = GrantTypes.Implicit,
            // 登錄後重定向到的地址
            RedirectUris = { "http://localhost:5002/signin-oidc" },
            // 註銷後重定向到的地址
            AllowedScopes = new List<string>
            {
                IdentityServerConstants.StandardScopes.OpenId,
                IdentityServerConstants.StandardScopes.Profile
            }
        }
    };
}

測試 MVC 客戶端

現在,對於新的 MVC 客戶端,一切都準備好了。

將瀏覽器導航到受保護的 控制器 action 以觸發認證握手。你應該能看到客戶端將你重定向到了 IdentityServer 的登錄頁。

登錄成功後,用戶將在授權確認頁中被呈現出來。在這裡用戶可以決定他是否想要發佈他的身份信息給客戶端應用程式。

註意: 授權確認頁可以通過客戶端定義對象的 RequireConsent 屬性被關閉(以每個客戶端為單位)。

最終瀏覽器將被重定向回客戶端應用程式,即展示用戶的身份信息。

註意:在開發期間你有時候可能會看到 無法驗證令牌 的異常信息。這是因為實際上簽名密鑰材料是憑空產生的,並且在只記憶體中駐留。這個異常在 客戶端 與 IdentityServer 不同步時就會發生。簡單地重覆客戶端上的操作,等到下一次元數據被捕獲時,一切都會再次正常工作的。

添加註銷

最後的最後,是給 MVC 客戶端添加 註銷功能。

通過 IdentityServer 這樣的服務進行身份認證,單單清除本地應用程式的 Cookies 是不夠的。你還需要往返一次 IdentityServer 來清理集中式單點登錄會話。

具體的協議步驟都在 OpenID Connect 中間件中實現了,簡單地添加以下代碼到某個控制器中就可以用來觸發註銷:

public async Task Logout()
{
    await HttpContext.Authentication.SignOutAsync("Cookies");
    await HttpContext.Authentication.SignOutAsync("oidc");
}

進一步實驗

如前面所說,OpenID Connect 中間件預設會請求 profile scope。這個 scope 還包含了用戶名或個人主頁等身份信息。

讓我們將這些身份信息添加到用戶定義裡面,這樣的話 IdentityServer 就可以把它們放到身份令牌中了:


public static List<TestUser> GetUsers()
{
    return new List<TestUser>()
    {
        new TestUser
        {
            SubjectId="1",
            Username="愛麗絲",
            Password="password",


            Claims = new []
            {
                new Claim("name", "愛麗絲"),
                new Claim("website", "https://alice.com")
            }
        },
        new TestUser
        {
            SubjectId="2",
            Username="博德",
            Password="password",

            Claims = new []
            {
                new Claim("name", "博德"),
                new Claim("website", "https://bob.com")
            }
        }
    };
}

下一次你認證的時候,你的身份信息頁將會顯示額外的身份信息。

請隨意添加更多的身份信息 - 還有更多的 scopes。OpenID Connect 中間件上的 Scope 屬性是你用來配置哪些 Scopes 將在認證期間被髮送到 IdentityServer 的地方。

值得註意的是,對令牌中身份信息的遍歷是一個擴展點 - IProfileService。因為我們正在使用 AddTestUser,所以預設使用的是 TestUserProfileService。你可以檢出這裡的源代碼來查看它的工作原理。

上一篇:IdentityServer4 中文文檔 -10- (快速入門)使用密碼保護API
下一篇:IdentityServer4 中文文檔 -12- (快速入門)添加外部認證支持


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Linux 系統(我特指發行版, 沒說內核) 下大部分軟體的風格就是不會仔細去考慮向後 的相容性, 比如你上個版本能用這種程式配置, 沒準到了下一個版本, 該程式已經不見了. 比如 sysvinit 這種東西. 設置時區同樣, 在 CentOS 7 中, 引入了一個叫 timedatectl 的設置 ...
  • 這一篇總結Linux系統中文件和目錄的創建,複製,移動和重命名,包括刪除這些最常用的操作。 創建 1,創建目錄 使用命令:mkdir 實踐:在根目錄下創建一個目錄命名為mcgrady 2,創建文件 使用命令:touch 實踐:在mcgrady目錄中創建兩個文件,分別命名為:aaa和bbb 複製 命令 ...
  • 1.生成任意大小的文件 記錄了1+0 的讀入 記錄了1+0 的寫出 1048576位元組(1.0 MB)已複製,0.00219263 秒,478 MB/秒 if代表輸入文件,of代表輸出文件,bs大小,count表示塊數 記錄了2+0 的讀入 記錄了2+0 的寫出 2097152位元組(2.1 MB)已 ...
  • redhat6編譯安裝git錯誤imap-send.c: 在函數‘ssl_socket_connect’中: imap-send.c:291: 警告:不建議使用‘TLSv1_method’(聲明於 /usr/local/include/openssl/ssl.h:1612) imap-send.c: ...
  • ping: unknown host www.baidu.com??? 修改/etc/resolv.conf,重啟網卡後,/etc/resolv.conf恢復到原來的狀態。 CentOS、redhat下麵直接修改/etc/resolv.conf不行。必須要在/etc /sysconfig/netwo ...
  • 關於系統的自動更新。近日有一情況是需要將java端後臺最新版本的系統文件覆蓋本地客戶端,簡稱自動更新了。 本地會獲取當前系統的版本號去請求後臺java的介面數據。返回給我的是後臺壓縮包轉的base64位元組流。 客戶端拿到新版本需要更新本地程式。 這裡是拿到的位元組流了。 這個方法可以解決在同一個解決方 ...
  • 通過創建自定義Tag Helpers,我們可以擴展現有元素或創建我們自己的元素。 ...
  • ASP.NET Core Tag Helpers系列目錄,共四篇: "ASP.NET Core MVC – Tag Helpers 介紹" "ASP.NET Core MVC – Caching Tag Helpers" "ASP.NET Core MVC – Form Tag Helpers" " ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...