.Net Core身份認證:IdentityServer4實現OAuth 2.0 客戶端模式 - 簡書

原文: .Net Core身份認證:IdentityServer4實現OAuth 2.0 客戶端模式 - 簡書

1、客戶端模式介紹

客戶端模式(Client Credentials Grant)是指客戶端直接向認證服務(Authorization Server)發送認證請求,獲取token,進行認證,通常適用於受信任的客戶端。
java

image.png

請求步驟爲:

  • 客戶端向認證服務器進行認證,並請求一個訪問令牌token
  • 認證服務器進行認證,經過以後,返回客戶端一個訪問令牌。

2、建立認證服務

  • 建立一個認證服務IdentityServerCenter,經過NuGet安裝IdentityServer4
  • 添加配置資源與客戶端的文件,引入using IdentityServer4.Models
public class Config {
        public static IEnumerable<ApiResource> GetResources() {
            return new List<ApiResource> {
                    new ApiResource {
                        Name = "ImageResource",
                        Scopes={ new Scope ("ImageResource")},//Scopes必須配置,不然獲取token時返回 invalid_scope
                    },
                    new ApiResource { Name = "FileResourse" },
                    new ApiResource { Name="Api",    Scopes={new Scope ("Api") } }
                };
        }
        public static IEnumerable<Client> GetClients() {
            return new List<Client> {
                    new Client {
                        ClientId = "ClientId",
                        AllowedGrantTypes =GrantTypes.ClientCredentials,//受權模式:客戶端模式
                        AllowedScopes={ "ImageResource","Api" }, //容許訪問的資源 GetResources()中配置的
                       ClientSecrets={ new Secret { Value= "ClientSecret".Sha256(), Expiration=DateTime.Now.AddMinutes(5)} }
                    } };
        }
    }
  • 注入IdentityServer4,添加IdentityServer4配置
public void ConfigureServices(IServiceCollection services) {
            //注入IdentityServer 添加IdentityServer4配置
            services.AddIdentityServer()
                .AddDeveloperSigningCredential()
                .AddInMemoryApiResources(Config.GetResources()) //添加配置的資源ApiResource
                .AddInMemoryClients(Config.GetClients());//添加配置的客戶端Client
          // services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        }
  • 使用IdentityServer4
public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
            //使用IdentityServer
            app.UseIdentityServer();
        }
  • 啓動項
    image.png

    因爲未使用MVC,訪問該api返回404。IdentityServer4提供一個地址可獲取相關配置項。
http://examplehostname.com.well-known/openid-configuration/

訪問 http://localhost:5000/.well-known/openid-configuration 將返回的信息序列化以下
api

image.png

scopes_supported": ["ImageResource", "Api", "offline_access"]即爲 Config中配置的訪問的資源 AllowedScopes

  • 使用postman獲取token
    image.png

    grant_type爲客戶端受權client_credentials,client_idClient_SecretConfig中配置的ClientIdSecret。接下來建立一個可訪問的資源。

3、建立資源服務

  • 建立一個資源服務項目ImageResourceApi
  • 注入認證
public void ConfigureServices(IServiceCollection services) {
            services.AddAuthentication(config => {
                config.DefaultScheme = "Bearer"; 
            }).AddIdentityServerAuthentication(option=> {
                option.ApiName = "ImageResource"; 
                option.Authority = "http://localhost:5000"; //認證服務的url
                option.ApiSecret = "ClientSecret".ToSha256();// 訪問的secret
                option.RequireHttpsMetadata = false;
                
            });
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        }
      public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            //使用認證
            app.UseAuthentication();
            app.UseMvc();
        }
  • 啓動資源服務,返回401未受權;
  • 使用postman帶着token請求資源服務ImageResourceApi,請求成功。
    image.png
相關文章
相關標籤/搜索