中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何進行IdentityServer4 指定角色授權

發布時間:2021-12-30 10:02:11 來源:億速云 閱讀:202 作者:柒染 欄目:大數據

本篇文章為大家展示了如何進行IdentityServer4 指定角色授權,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

1. 業務場景

IdentityServer4 授權配置Client中的AllowedScopes,設置的是具體的 API 站點名字,也就是使用方設置的ApiName,示例代碼:

//授權中心配置
new Client
{
   ClientId = "client_id_1",
   AllowedGrantTypes = GrantTypes.ResourceOwnerPassword,
   AllowOfflineAccess = true,
   AccessTokenLifetime = 3600 * 6, //6小時
   SlidingRefreshTokenLifetime = 1296000, //15天
   ClientSecrets =
   {
       new Secret("secret".Sha256())
   },
   AllowedScopes =
   {
       "api_name1"
   },
}

//API 服務配置
app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions
{
   Authority = $"http://localhost:5000",
   ApiName = "api_name1",
   RequireHttpsMetadata = false
});

上面兩個api_name1配置要一致,問題來了,因為授權中心的scope配置是整個 API 服務,如果我們存在多個Client配置,比如一個前臺和后臺,然后都需要訪問api_name1,就會出現一些問題。

比如,api_name1服務中的一個接口服務配置代碼:

[Authorize()]
[Route("api/values")]
[HttpGet]public IActionResult Get(){   
 return Ok(); }

Authorize()的配置,說明api/values接口需要授權后訪問,如果授權中心配置了兩個Client(前臺和后臺),并且scope都包含了api_name1,現在就會出現兩種情況:

  1. 前臺Client和后臺Client,都需要授權后訪問api/values接口:沒有問題。

  2. 前臺Client不需要授權后訪問,后臺Client需要授權后訪問:有問題,前臺Client沒辦法訪問了,因為api/values接口設置了Authorize()

其實,說明白些,就是該如何讓 API 服務指定Client授權訪問?比如:[Authorize(ClientId = 'client_id_1')]

2. 解決方案

沒有[Authorize(ClientId = 'client_id_1')]這種解決方式,不過可以使用[Authorize(Roles = 'admin')]

授權中心的ResourceOwnerPasswordValidator代碼,修改如下:

public class ResourceOwnerPasswordValidator : IResourceOwnerPasswordValidator
{
   private readonly IUserService _userService;

   public ResourceOwnerPasswordValidator(IUserService userService)
   {
       _userService = userService;
   }

   public async Task ValidateAsync(ResourceOwnerPasswordValidationContext context)
   {
       var user = await _userService.Login(context.UserName, context.Password);
       if (user != null)
       {
           var claims = new List<Claim>() { new Claim("role", "admin") }; //根據 user 對象,設置不同的 role
           context.Result = new GrantValidationResult(user.UserId.ToString(), OidcConstants.AuthenticationMethods.Password, claims);
       }
   }
}

授權中心的startup配置,修改如下

var builder = services.AddIdentityServer();
builder.AddTemporarySigningCredential()
       //.AddInMemoryIdentityResources(Config.GetIdentityResources())
       .AddInMemoryApiResources(new List<ApiResource>
       {
           new ApiResource("api_name1", "api1"){ UserClaims = new List<string> {"role"}}, //增加 role claim
           new ApiResource("api_name2", "api2"){ UserClaims = new List<string> {"role"}}
       })
       .AddInMemoryClients(Config.GetClients());

API 服務接口,只需要配置如下:

[Authorize()]
[Route("api/values")]
[HttpGet]
public IActionResult Get()
{
   return Ok();
}

[Authorize(Roles = "admin")]
[Route("api/values2")]
[HttpGet]
public IActionResult Get2()
{
   return Ok();
}

[Authorize(Roles = "admin,normal")]
[Route("api/values3")]
[HttpGet]
public IActionResult Get3()
{
   return Ok();
}

需要注意的是,api/values接口雖然沒有設置具體的Roles,但每個Role都可以訪問。

上述內容就是如何進行IdentityServer4 指定角色授權,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

繁昌县| 新源县| 进贤县| 葫芦岛市| 酒泉市| 内丘县| 黄龙县| 重庆市| 开原市| 镇安县| 儋州市| 凉城县| 青岛市| 尼玛县| 抚松县| 汝州市| 美姑县| 米泉市| 双辽市| 栖霞市| 汉源县| 家居| 罗源县| 来安县| 自贡市| 改则县| 临沧市| 广东省| 宜昌市| 突泉县| 中宁县| 红原县| 阳新县| 绥滨县| 克拉玛依市| 泸溪县| 阜宁县| 拉孜县| 营口市| 黄石市| 米脂县|