1. 程式人生 > >使用Identity Server 4建立Authorization Server (1)

使用Identity Server 4建立Authorization Server (1)

官方文件很詳細的.

使用OAuth可以更安全, 這裡我們的authorization server和web api 以及網站將分別獨立執行. 

建立authorization server

建立asp.net core 專案使用空模板.

專案建立後, 執行方式改為使用控制檯執行而不是IISExpress, 以便檢視各種debug資訊.

開啟launchSettings.json:

{
  "profiles": {
    "AuthServer": {
      "commandName": "Project",
      "launchBrowser": true
, "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" }, "applicationUrl": "http://localhost:5000/" } } }

把IISExpress相關的內容刪掉, 然後埠改為5000.

Program.cs裡的BuildWebHost也應該加上Url:

        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseUrls(
"http://0.0.0.0:5000") .UseStartup<Startup>() .Build();

其實不加也好用.

執行就會彈出控制檯:

安裝Identity Server4:

開啟nuget, 搜尋 identityserver4:

安裝即可.

配置asp.net core 管道

開啟startup.cs, 編輯Configure方法:

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.UseDeveloperExceptionPage();
            app.UseIdentityServer();
}

就是使用上面這個中介軟體. 

配置Identity Server

還是Startup.cs,編輯ConfigureServices方法:

這裡不僅要把IdentityServer註冊到容器中, 還要至少對其配置三點內容:

1. 哪些API可以使用這個authorization server.

2. 那些客戶端Client(應用)可以使用這個authorization server.

3. 指定可以使用authorization server授權的使用者.

首先需要把上面這些做成一個配置檔案:

建立Configuration/InMemoryConfiguration.cs:

namespace AuthServer.Configuration
{
    public class InMemoryConfiguration
    {
        public static IEnumerable<ApiResource> ApiResources()
        {
            return new[]
            {
                new ApiResource("socialnetwork", "社交網路")
            };
        }

        public static IEnumerable<Client> Clients()
        {
            return new[]
            {
                new Client
                {
                    ClientId = "socialnetwork",
                    ClientSecrets = new [] { new Secret("secret".Sha256()) },
                    AllowedGrantTypes = GrantTypes.ResourceOwnerPasswordAndClientCredentials,
                    AllowedScopes = new [] { "socialnetwork" }
                }
            };
        }

        public static IEnumerable<TestUser> Users()
        {
            return new[]
            {
                new TestUser
                {
                    SubjectId = "1",
                    Username = "[email protected]",
                    Password = "password"
                }
            };
        }
    }
}

ApiResources: 這裡指定了name和display name, 以後api使用authorization server的時候, 這個name一定要一致, 否則就不好用的.

Clients: Client的屬性太多了, 這裡就指定幾個. 其中ClientSecrets是Client用來獲取token用的. AllowedGrantType: 這裡使用的是通過使用者名稱密碼和ClientCredentials來換取token的方式. ClientCredentials允許Client只使用ClientSecrets來獲取token. 這比較適合那種沒有使用者參與的api動作. AllowedScopes: 這裡只用socialnetwork

Users: 這裡的記憶體使用者的型別是TestUser, 只適合學習和測試使用, 實際生產環境中還是需要使用資料庫來儲存使用者資訊的, 例如接下來會使用asp.net core identity. TestUser的SubjectId是唯一標識.

然後回到StartUp的ConfigureServices:

前一篇文章講過, 我們需要對token進行簽名, 這意味著identity server需要一對public和private key. 幸運的是, 我們可以告訴identity server在程式的執行時候對這項工作進行設定: AddDeveloperSigningCredential(), 它預設會存到硬碟上的, 所以每次重啟服務不會破壞開發時的資料同步. 這個方法只適合用於identity server4在單個機器執行, 如果是production farm你得使用AddSigningCredential()這個方法.

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddIdentityServer()
                .AddDeveloperSigningCredential()
                .AddTestUsers(InMemoryConfiguration.Users().ToList())
                .AddInMemoryClients(InMemoryConfiguration.Clients())
                .AddInMemoryApiResources(InMemoryConfiguration.ApiResources());
        }

然後執行一下:

沒報錯, 紅線部分是記憶體配置版的一些解釋.

獲取Token

開啟postman, 如果你無法安裝postman, 也無法進入Chrome商店, 那麼你可以買一個海外伺服器, 使用shadowsocks伺服器和客戶端進行代理, 然後就可以訪問google了.

首先我們傳送一個錯誤的client_id, 然後得到的結果是: invalid_client. 控制檯的資訊如下:

然後我們再發送一個正確的資料:

這次獲取到了token. 控制檯資訊如下:

由於identity server我們設定的是 ResourceOwnerPasswordAndClientCredentials 這個GrantType, 所以使用使用者名稱密碼以及使用ClientCredentials都可以. 那我們把使用者名稱和密碼去掉, 只發送Client Credentials:

仍然獲取到了token. 控制檯上的資訊與上一個稍有不同, 沒有user相關的資訊了:

使用正經的證書:

證書可以通過幾種渠道獲得, 可以購買, 可以使用IIS生成, 也可以使用Openssl這樣的工具生成證書. 我就使用openssl吧.

安裝後, 開啟命令列.

openssl req -newkey rsa:2048 -nodes -keyout socialnetwork.key -x509 -days 365 -out socialnetwork.cer

具體的資訊就不管了. 這個證書的有效期是365天, 命令引數裡面設定的.

這是生成的檔案:

一個證書和一個key, 然後我們需要給他們倆封裝成一個檔案, 以便identity server可以使用它們去正確的簽名tokens. 這就需要使用另一個命令:

openssl pkcs12 -export -in socialnetwork.cer -inkey socialnetwork.key -out socialnetwork.pfx

這裡發生了錯誤...那就使用管理員開啟命令列:

輸入密碼和確認密碼後, 沒問題了.

pfx就是我們需要的檔案.

然後修改一個Startup的ConfigureServices:

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddIdentityServer()
                // .AddDeveloperSigningCredential()
                .AddSigningCredential(new X509Certificate2(@"D:\Projects\test\socialnetwork.pfx", "password"))
                .AddTestUsers(InMemoryConfiguration.Users().ToList())
                .AddInMemoryClients(InMemoryConfiguration.Clients())
                .AddInMemoryApiResources(InMemoryConfiguration.ApiResources());
        }

現在執行程式的話, 啥也不顯示. 那麼接下來, 就

新增像樣的UI

在專案根目錄開啟Powershell(可以在專案根目錄, 按住shift, 點選右鍵的Powershell)

然後輸入命令:

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

然後就把UI下載到專案了.

看看生成的檔案, 很多:

由於有wwwroot下很多靜態檔案, 所以asp.net core 需要啟用服務靜態檔案的功能: 修改Startup的Configure方法:

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.UseDeveloperExceptionPage();
            app.UseIdentityServer();
            app.UseStaticFiles();
            app.UseMvcWithDefaultRoute();
        }

使用靜態檔案, 並且使用了MVC.

別忘了在ConfigureServices裡面註冊MVC:

public void ConfigureServices(IServiceCollection services)
        {
            services.AddIdentityServer()
                // .AddDeveloperSigningCredential()
                .AddSigningCredential(new X509Certificate2(@"D:\Projects\test\socialnetwork.pfx", "[email protected]"))
                .AddTestUsers(InMemoryConfiguration.Users().ToList())
                .AddInMemoryClients(InMemoryConfiguration.Clients())
                .AddInMemoryApiResources(InMemoryConfiguration.ApiResources());

            services.AddMvc();
        }

然後執行一下試試:

它現在已經具備了這些功能!

使用TestUser也可以登陸成功:

當然這個UI可以根據情況自行定義.

相關推薦

使用Identity Server 4建立Authorization Server (1)

官方文件很詳細的. 使用OAuth可以更安全, 這裡我們的authorization server和web api 以及網站將分別獨立執行.  建立authorization server 建立asp.net core 專案使用空模板. 專案建立後, 執行方式改為使用控制檯執行而不是IISEx

使用Identity Server 4建立Authorization Server (2)

可能 參數 ecif fig register startup 類型 cal mat 第一部分: http://www.cnblogs.com/cgzl/p/7780559.html 第一部分主要是建立了一個簡單的Identity Server. 接下來繼續: 建立Web

使用Identity Server 4建立Authorization Server (5)

連接字符串 mapr path 框架 ise network edit setting pin 預備知識: http://www.cnblogs.com/cgzl/p/7746496.html 第一部分: http://www.cnblogs.com/cgzl/p/7780

使用Identity Server 4建立Authorization Server (6) - js(angular5) 客戶端

include 節點 ogr 包含 發的 for icon ets list 預備知識: http://www.cnblogs.com/cgzl/p/7746496.html 第一部分: http://www.cnblogs.com/cgzl/p/7780559.html

使用Identity Server 4建立Authorization Server (3)

上一部分簡單的弄了個web api 並通過Client_Credentials和ResourceOwnerPassword兩種方式獲取token然後進行api請求. 這次講一下Authentication 身份驗證 (而Authorization是授權, 注意區分), 使用的是OpenIdCon

使用Identity Server 4建立Authorization Server (4)

上一篇講了使用OpenId Connect進行Authentication. 下面講 Hybrid Flow和Offline Access 目前我們解決方案裡面有三個專案 Authorization Server, Web api和Mvc Client. 在現實世界中, 他們可能都在不同

ASP.NET Core3.1使用Identity Server4建立Authorization Server-1

# 前言 網上關於Identity Server4的資料有挺多的,之前是一直看楊旭老師的,最近專案中有使用到,在使用.NET Core3.1的時候有一些不同。所以在此記錄一下。 > 預備知識: https://www.cnblogs.com/cgzl/p/9405796.html > > 本文內容參考 >

ASP.NET Core3.1使用Identity Server4建立Authorization Server-2

# 前言 # 建立Web Api專案 在同一個解決方案下建立一個Web Api專案`IdentityServer4.WebApi`,然後修改Web Api的launchSettings.json。參考第一節,當然可以不修改的,埠號為`5001`。 ``` csharp { "profiles":

學習Identity Server 4的預備知識

發布 開發 簡單的 密碼 是否 alt imp load 通信 我要使用asp.net core 2.0 web api 搭建一個基礎框架並立即應用於一個實際的項目中去. 這裏需要使用identity server 4 做單點登陸. 下面就簡單學習一下相關的預備知識. 基於

要用Identity Server 4 -- OAuth 2.0 超級簡介

分隔 理解 大小 很多 應用程序 identity 復制 字符串 返回 OAuth 2.0 簡介 OAuth有一些定義: OAuth 2.0是一個委托協議, 它可以讓那些控制資源的人允許某個應用以代表他們來訪問他們控制的資源, 註意是代表這些人, 而不是假冒或模仿這些人

Identity Server 4 - Hybrid Flow - 保護API資源

還需 defaults rest 兩個 ade die tar try 意思 這個系列文章介紹的是Identity Server 4 的 Hybrid Flow, 前兩篇文章介紹了如何保護MVC客戶端, 本文介紹如何保護API資源. 保護MVC客戶端的文章: https:

eShopOnContainers 看微服務③:Identity Service OAuth 2.0 簡介 OpenID Connect 簡介 Identity Server 4 eShopOnContainers 知多少[3]:Identity microservice

引言 通常,服務所公開的資源和 API 必須僅限受信任的特定使用者和客戶端訪問。那進行 API 級別信任決策的第一步就是身份認證——確定使用者身份是否可靠。 在微服務場景中,身份認證通常統一處理。一般有兩種實現形式: 基於API 閘道器中心化認證:要求客戶端必須都通過閘道器訪問微服務。(這就要求

CAS單點登入(1):cas-4.0.0-server 簡單部署

下載CAS4.0.0 選擇4.0.0 的原因是:4.0.0以後打包比較麻煩,4.0.0版本內有打包好的war 下載地址 github專案地址 cas 4.0.0地址 解壓找到war包部署 解壓 cas-server-4.

學習Identity Server 4的預備知識 (誤刪, 重補)

我要使用asp.net core 2.0 web api 搭建一個基礎框架並立即應用於一個實際的專案中去. 這裡需要使用identity server 4 做單點登陸. 下面就簡單學習一下相關的預備知識. 基於Token的安全驗證體系 這個比較簡單, 簡單來說就是為了證明我們有訪問許可權, 我們首先需

Identity Server 4 (JWKS 端點和 RS256 演算法) 來保護 Python web api

目前正在使用asp.net core 2.0 (主要是web api)做一個專案, 其中一部分功能需要使用js客戶端呼叫python的pandas, 所以需要建立一個python 的 rest api, 我暫時選用了hug, 官網在這: http://www.hug.rest/. 目前專案使用的是ide

Identity Server 4

Claims 我不知道怎麼樣翻譯這個詞比較好, 所以我一般就不翻譯了. 在前一篇文章裡, MVC客戶端配置身份認證的時候有這麼一句話(Startup的ConfigureServices): JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Cl

Identity Server 4 預備知識 -- OAuth 2.0 簡介

OAuth 2.0 簡介 OAuth有一些定義: OAuth 2.0是一個委託協議, 它可以讓那些控制資源的人允許某個應用以代表他們來訪問他們控制的資源, 注意是代表這些人, 而不是假冒或模仿這些人. 這個應用從資源的所有者那裡獲得到授權(Authorization)和access token, 隨後就可

Identity Server 4 預備知識 -- OpenID Connect 簡介

這篇文章我要介紹一下 OpenID Connect. OAuth 2.0 不是身份認證協議 OAuth 2.0 不是身份認證(Authentication)協議. 為什麼有人會認為OAuth 2.0具有身份認證的功能? 這是因為OAuth2經常作為身份認證(Authentication)協議的一部分來

第44章 添加新協議 - Identity Server 4 中文文檔(v1.0.0)

iges author 重用 sign tsig dds mode 上下文 bool 除了對OpenID Connect和OAuth 2.0的內置支持之外,IdentityServer4還允許添加對其他協議的支持。 您可以將這些附加協議端點添加為中間件或使用例如MVC控制器

第47章 授權端點(Authorize Endpoint) - Identity Server 4 中文文檔(v1.0.0)

Nid str ons 響應 challenge redirect 授權 轉發 必須 授權端點可用於通過瀏覽器請求令牌或授權碼。此過程通常涉及最終用戶的身份驗證和可選的同意。 註意 IdentityServer支持OpenID Connect和OAuth 2.0授權請求參