• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

IdentityServer4 授权配置AllowedScopes实例

c# 搞代码 4年前 (2022-01-09) 28次浏览 已收录 0个评论
文章目录[隐藏]

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 = &quo<b>本文来源gao@!dai!ma.com搞$$代^@码!网</b>t;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 对象,设置不同的 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实例的详细内容,更多请关注搞代码gaodaima其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:IdentityServer4 授权配置AllowedScopes实例

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址