1. 程式人生 > 實用技巧 >identityserver4 V4 新版本踩坑

identityserver4 V4 新版本踩坑

identityserver4 的版本前段時間更新到V4,和之前的版本,還是有一些使用的差異;

1. API資源宣告,之前版本用的是ApiResource,新版本用的是ApiScope,從名字就可以看出區別,新版是用 Scope 區分的;

        /// <summary>
        /// 新版本
        /// </summary>
        public static IEnumerable<ApiScope> Apis =>
            new List<ApiScope>
            {
                
new ApiScope("api1", "my api1"), }; /// <summary> /// 舊版本 /// </summary> public static IEnumerable<ApiResource> ApiScopes => new List<ApiResource> { new ApiResource("api1", "my api1"), };

2. 如果使用了IdentityServer4 的快速入門的登入等介面程式碼,這裡也有好些要改的,我是測試專案直接賦值的新版的快速入門程式碼

3.因為API宣告的地方做了修改,相應的在API的認證授權上也不一樣

新版認證的時候不需要設定Audience

新版的Audience 是從Claim 中獲取的,需要新增對應的授權

// 新版API認證

services.AddAuthentication("Bearer")
.AddJwtBearer("Bearer", options =>
{
  options.Authority = "http://localhost:5000";

  options.RequireHttpsMetadata = false;

  options.TokenValidationParameters = new TokenValidationParameters
  {
    ValidateAudience = false
  };
});

// API授權
services.AddAuthorization(options =>
{
  options.AddPolicy("ApiScope", policy =>
  {
    policy.RequireAuthenticatedUser();
    policy.RequireClaim("scope", "api1");
  });
});

// 舊版

services.AddAuthentication(options =>
{
  options.DefaultScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme;
  options.DefaultAuthenticateScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme;
  options.DefaultChallengeScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme;
  options.DefaultSignInScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme;
  options.DefaultForbidScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme;
})
.AddIdentityServerAuthentication(options =>
{
  options.Authority = IdentityUrl;
  options.ApiName = "orderapi";
  options.RequireHttpsMetadata = false;
});

// 舊版也有這個寫法

//services.AddAuthentication("Bearer")
// .AddJwtBearer("Bearer", options =>
// {
// options.Authority = IdentityUrl;
// options.RequireHttpsMetadata = false;
// options.Audience = "orderapi";
// });

從我目前的使用上來說大體上就這裡需要注意