1. 程式人生 > >從壹開始 [ Ids4實戰 ] 之七 ║ 客戶端、服務端、授權中心全線打通

從壹開始 [ Ids4實戰 ] 之七 ║ 客戶端、服務端、授權中心全線打通

1、經過元旦兩天的全力整改,終於在這新的一年,完成了我的佈道生涯的第一個大步走 —— 那就是客戶端(VUE)、服務端(ASP.NET Core API)、授權中心(IdentityServer4)的大融合,不僅有文件也有程式碼,更重要的是實戰。

2、這一大步裡邊當然也有很多小步驟,知識點就不說了,過去的文章裡都有。

3、具體的程式碼和效果呢,我會在下邊給大家先簡單的說明一下,今天的目的主要是第一篇,概述下,裡邊的小知識點或者注意事項,其實主要還是Ids4的內容,我還是會慢慢的在以後的文章或者視訊中,給大家講解的。

4、有人問了我的新年計劃,主要是CI/CD這一塊,配合Docker和DDD,實現第二個閉環,具體還沒有想好,等我通知吧。

 

那下邊我就簡單的說說效果吧,大家也可以自行體驗一下:

http://vueadmin.neters.club

(支援滑動更新等基本操作,後期增加單點登入)

 

一、Blog.Admin 客戶端

Admin專案,是基於Vue+Ele開發的一套後端許可權框架,是我自主研發的,裡邊主要是用到了動態資料庫授權認證,使用JWT的複雜策略授權技術,精確到按鈕基本,目前部門資料許可權還在設計當中,以後也會附加上,這是內部授權這一塊,但是認證想做一個統一認證中心,所以就想到了IdentityServer4了。

 

Vue專案和其他的SPA專案是一樣的,連線IdentityServer4認證中心,主要是通過oidc-client這個外掛來處理的,

npm install oidc-client --save

 

用法其實很簡單,我簡單說下思路,具體的看我的程式碼,或者看官網都可以:

 

 class ApplicationUserManager extends UserManager {
  constructor () {
    super({
      authority: 'http://ids.neters.club',
      client_id: 'blogadminjs',
      redirect_uri: 'http://vueadmin.neters.club/callback',
      response_type: 'id_token token',
      scope: 'openid profile roles blog.core.api',
      post_logout_redirect_uri: 'http://vueadmin.neters.club'
    })
  }

 

 

 

這個是核心方法,目的是通過配置,實現使用者管理,比如登入,跳轉,回撥,獲取使用者資訊,令牌token,重新整理等等,當然以後可能會配合單點登入做處理。

 

  methods: {
    async refreshUserInfo() {
      const user = await applicationUserManager.getUser();
      if (user) {
        this.user.name = user.profile.name;
        this.user.isAuthenticated = true;
      } else {
        this.user.name = "";
        this.user.isAuthenticated = false;
      }
    }
  }

 

 

 

這個是使用上邊的UserManager來處理遠端獲取到的使用者資料。

具體的程式碼我已經放到了Blog.Admin專案的ids4分支下了:

 

 

 

 

 

二、Blog.Core 資源服務端

這個專案想必都知道了,不多說什麼,其實你的任意一個後端服務專案都可以,只要做個表結構,然後配置Identityserver4的認證即可。

 

//2.2【認證】、IdentityServer4 認證 (暫時忽略)
services.AddAuthentication("Bearer")
  .AddIdentityServerAuthentication(options =>
  {
      options.Authority = "http://ids.neters.club";
      options.RequireHttpsMetadata = false;
      options.ApiName = "blog.core.api";
  });

 

 

 

這個就是一個核心的程式碼,將我們BlogCore的資源伺服器認證方式,從JWT改成Ids4認證。

 

 

 

修改完認證方式以後,下邊就是簡單的對其中幾個小知識點進行微調了,比如某些Claim宣告欄位,我用的和Ids4不太一樣,所以就簡單微調一下,主要的修改內容,我也新建了一個分支,可以自行檢視下,修改的地方不多。

 

 

 

 

 

三、Blog.Idp 認證授權中心

這個才是整個專案的重頭戲,專案的重中之重,不過配置起來也不難,具體的操作和使用,我也在錄視訊和寫文章,其實只要瞭解這幾個知識點,就基本學會了Ids4了:

1、如何引用指定的nuget包;

2、JWT、OpenID、OAuth2、OIDC 四者的關係和內容;

3、常見的四種授權方式:簡化、混合、密碼、客戶端等要明白場景,會用;

4、學會聯調;

具體的就不多說了,不是今天的講解內容。今天主要點一下部署的時候的幾個知識點,其他的看我的程式碼即可,這次是master分支。

 

// 使用證書,可以直接使用開發證書
builder.AddDeveloperSigningCredential();

// 或者自己配置
.AddDeveloperSigningCredential(true, ConstanceHelper.AppSettings.CredentialFileName)
.AddSigningCredential(new X509Certificate2(Path.Combine(Environment.WebRootPath,
        Configuration["Certificates:Path"]),
        Configuration["Certificates:Password"]))

 

 

 

證書這個很重要,當然既然是安全,就要好好處理,可以配合的證書,繼續搞搞HTTPS安全協議,未來還是很多要處理的。

 

 new Client {
     ClientId = "blogadminjs",
     ClientName = "Blog.Admin JavaScript Client",
     AllowedGrantTypes = GrantTypes.Implicit,
     AllowAccessTokensViaBrowser = true,

     RedirectUris =           { "http://vueadmin.neters.club/callback" },
     PostLogoutRedirectUris = { "http://vueadmin.neters.club" },
     AllowedCorsOrigins =     { "http://vueadmin.neters.club" },

     AllowedScopes = {
         IdentityServerConstants.StandardScopes.OpenId,
         IdentityServerConstants.StandardScopes.Profile,
         "roles",
         "blog.core.api"
     }
 }

 

 

 

這是另一個重點,必須要配置客戶端,不僅是資料生成到資料庫,更是在授權的時候,起到安全的作用。

 

最後一個小問題,確定是我自己的問題,就是部署的時候,我本來用的Nginx進行代理,但是配置檔案裡,卻依然是localhost:

 

 

 

這樣就導致了一個問題,雖然我的認證中心專案可以正常的跑,我是說伺服器生產環境,但是用客戶端去登入的時候,會自動跑到locaohost裡,畢竟配置檔案是這樣的。

網上找了很多資料,都是本地教程,部署的都很少,我也是很方,最後我找到了官方的一個線上demo專案,它是正常的,我仔細研究了下程式碼,程式碼和我的沒啥區別,最後靈機一動,我看了看他們的伺服器,是IIS!我趕緊實驗了一番,還真的是正常了:

 

 

 

 

 

但是這個不科學呀,這個我要承認下,肯定是我學藝不精,Nginx肯定是可行的,但是我沒有找到為何去配置,這個時候應該檢視官網的,當我繼續在尋找的時候,但是正好有一個小夥伴的小夥伴告訴了我,賊簡單,這個故事告訴我們,學習知識要從細節著手,不能知其然而不知其所以然。

 var builder = services.AddIdentityServer(options =>     {         options.Events.RaiseErrorEvents = true;         options.Events.RaiseInformationEvents = true;         options.Events.RaiseFailureEvents = true;         options.Events.RaiseSuccessEvents = true;         options.IssuerUri = "http://ids.neters.club";// 就是這裡         options.PublicOrigin = "http://ids.neters.club";     })

 

結果還是正確的,看來還是要多讀文件,當然如果實在是繞不過來,也可以先求助。

 

 

 

就這樣,元旦一整天就過去了,專案也終於放上去了,當然還有很多要優化的,比如如何在Nginx部署IdentityServer的時候配置HTTPS協議,既然開始了,便只顧風雨兼程了。

 

四、下一步 2020

今年開始,一切都是新的,第一個閉環已經完成了,當然還有很多需要優化,比如單點登入,DDD和Blog專案也遷移到Ids4上來,那下一個就開始了 —— CI/CD DevOps 我來了。

 

https://github.com/anjoy8/Blog.IdentityServer(授權)

https://github.com/anjoy8/Blog.Admin(客戶端)

https://github.com/anjoy8/Blog.Core(資源伺服器)