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,现在就会出现两种情况:
前台
Client和后台
Client,都需要授权后访问
api/values接口:没有问题。
前台
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 对象,设置不同的 rolecontext.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 claimnew 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 授权配置AllowedScopes实例02-21
- ASP.NET Core 应用程序发布命令实例02-21
- SignalR简介及用法介绍02-21
- 一个很强大的控件--PropertyGrid02-21
- 微信公众平台SDK核心库的详细介绍02-21
- EF架构--FluentValidation的实际用法02-21
- win10硬盘被占用怎么办02-21
- 使用Action的模型绑定实例教程02-21
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- ASP.NET Core 应用程序发布命令实例
ASP.NET Core 应用程序发布命令实例
26-02-21 - SignalR简介及用法介绍
SignalR简介及用法介绍
26-02-21 - 一个很强大的控件--PropertyGrid
一个很强大的控件--PropertyGrid
26-02-21 - 微信公众平台SDK核心库的详细介绍
微信公众平台SDK核心库的详细介绍
26-02-21 - win10硬盘被占用怎么办
win10硬盘被占用怎么办
26-02-21 - 使用Action的模型绑定实例教程
使用Action的模型绑定实例教程
26-02-21 - win10录屏功能怎么用图文教程 微软win10录屏文件在
win10录屏功能怎么用图文教程 微软win10录屏文件在
26-02-21 - win10网卡驱动出现问题解决方法
win10网卡驱动出现问题解决方法
26-02-21 - Unity C# GetSaveFileName()的实例详解
Unity C# GetSaveFileName()的实例详解
26-02-21 - 浅谈WPF之Binding表达式
浅谈WPF之Binding表达式
26-02-21
