初探IdentityServer4(客戶端模式)

語言: CN / TW / HK

Oatuth2協議的客戶端模式介紹

    • Client Credentials Grant (客戶端模式)是Oauth2.0協議中,四種模式自建單的一種。它由兩部分構成, 客戶端認證伺服器 。認證伺服器確認客戶端無誤後返回一個token,客戶端請求帶著token訪問資源。(一般使用場景是在一個安全的環境下,例如我的同一個系統中,一個api請求另外一個api)。

    • 這裡借用下阮一峰老師畫的圖(部落格地址=》http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html)

IdentityServer4客戶端模式實現

  • 首先我們建立一個core的api專案作為認證伺服器,新增nuget程式包IdentityServer4,將啟動埠設定為 5000

  • 接下來新增一個類,取名字叫做Config,我們用它來初始化Identityserver(配置要保護的資源和可以訪問該API的客戶端伺服器)。

    程式碼如下:

/// <summary>
    /// Idnetity配置,初始化Identityserver
    /// </summary>
    public class Config
    {
        //定義要保護的資源(webapi)
        public static IEnumerable<ApiResource> GetApiResources()
        {
            return new List<ApiResource>
            {
                new ApiResource("api1", "My API")
            };
        }
        //定義可以訪問該API的客戶端
        public static IEnumerable<Client> GetClients()
        {
            return new List<Client>
            {
                new Client()
                {
                    ClientId = "client",
                    AllowedGrantTypes = GrantTypes.ClientCredentials,  //設定模式,客戶端模式
                    ClientSecrets =
                    {
                        new Secret("secret".Sha256())
                    },
                    AllowedScopes = { "api1" }
                }
            };
        }
    }
  • 接下來配置startup,將資源和客戶端的初始資訊服務加入到DI容器,同時引用IdentityServer中介軟體。程式碼如下所示:

public void ConfigureServices(IServiceCollection services)
        {
            services.AddIdentityServer()
                .AddDeveloperSigningCredential()
                .AddInMemoryApiResources(Config.GetApiResources())  //配置資源
                .AddInMemoryClients(Config.GetClients());        //配置客戶端
            services.AddMvc();
        }
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            //使用identityserver中介軟體
            app.UseIdentityServer();
            app.UseMvc();
        }
  • 再新增一個webapi專案,作為我們的資源伺服器。新增nuget包,IdentityServer4.AccessTokenValidation,將啟動埠設定為 5001

  • 2、配置startup,新增認證伺服器地址,和apiname &&引用中介軟體,程式碼如下:

public void ConfigureServices(IServiceCollection services)
        {
            services.AddAuthentication("Bearer")
                .AddIdentityServerAuthentication(options =>
                {
                    options.Authority = "http://localhost:5000";    //配置Identityserver的授權地址
                    options.RequireHttpsMetadata = false;           //不需要https
                    options.ApiName = "api1";                        //api的name,需要和config的名稱相同
                });
            services.AddMvc();
        }
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseAuthentication();// 新增認證中介軟體
            app.UseMvc();
        }
    • 將受保護資源controller新增 [Authorize] 。(因為資源伺服器AddIdentityServerAuthentication 方法的引數和返回值都是AuthenticationBuilder(類似於一箇中間件),所以可以多次呼叫AddIdentityServerAuthentication方法來控制這個api 資源可以讓誰訪問到。)

    • 最開始我們直接訪問資源伺服器的api,返回401,因為我們的資源被保護了。

    • 這時候來到IdentityServer4的官網,官網給出了這麼一個地址=》

    • 我們訪問這個地址時候,它會返回我們的Config配置=》

    • 其中有一個token_endpoint的url地址,我們帶著Client的配置來訪問它=》

    • 此時拿到Token,再帶著token去訪問我們的資源,爭取獲取到資源資料=》

https://github.com/conanl5566/dotnet-core-Example/tree/master/WebApplication25