千家信息网

如何进行IdentityServer4 指定角色授权

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇文章为大家展示了如何进行IdentityServer4 指定角色授权,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1. 业务场景IdentityServe
千家信息网最后更新 2026年11月01日如何进行IdentityServer4 指定角色授权

本篇文章为大家展示了如何进行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() { 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
{
new ApiResource("api_name1", "api1"){ UserClaims = new List {"role"}}, //增加 role claim
new ApiResource("api_name2", "api2"){ UserClaims = new List {"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 指定角色授权,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

配置 接口 服务 前台 后台 问题 代码 角色 两个 内容 就是 技能 服务配置 知识 不同 简明 一致 简明扼要 业务 也就是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 咖啡 云南咖啡 天津市摩尔互联网科技 哈尔滨大商圈互联网科技有限公司 互联网科技的发展 重庆科技学院互联网 新华互联网科技校企合作 温州喔噻互联网科技有限公司 港股科技和互联网 互联网科技革命什么开始 江阴互联网智能科技产品进口 哈尔滨屹滨互联网科技有限公司 深圳市优智互联网科技有限公司 青海科技产业互联网发展 国大互联网教育科技有限公司工作 洛阳共同富裕互联网科技有限公司 三亚科技创新互联网基地 第三届互联网大会安防黑科技 科技互联网企业在行动 小牛互联网科技有限公司地址 朗新科技与工业互联网 互联网科技上市公司 唐信互联网科技 大连 互联网科技公司招聘 江苏南京365互联网科技 中盈科技互联网信息有限公司 上海宁丞科技互联网 锡山区互联网智能科技产品供应 本届互联网大会上的黑科技 萌小萌互联网科技河南有限公司
0