IdentityServer4 認可設定 Client
の AllowedScopes
は、ユーザーが設定した ApiName コードである特定の API サイト名を設定します。 . code>、サンプル コード: <code>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')]
。
没有[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
api_name1
設定は、認証センターの scope 設定は API サービス全体です。フロントエンドとバックエンドなどの複数の <code>Client
設定があり、両方が api_name1
にアクセスする必要がある場合、いくつかの問題が発生します。が発生します。 🎜🎜たとえば、api_name1
サービスのインターフェイス サービス設定コード: 🎜Authorize()
設定と説明認証センターが 2 つの クライアント
(フロントエンドとバックエンド) および scope
で構成されている場合は、認証後に api/values
インターフェイスにアクセスする必要があります。どちらにも api_name1 が含まれており、次の 2 つの状況が発生します: 🎜Client
とバックグラウンド Client code> では、すべて <code>api/values
インターフェイスへのアクセスを許可する必要がありますが、問題ありません。 🎜
クライアント
にはアクセスするための承認が必要ありませんが、バックエンド クライアント
にはアクセスするための承認が必要です: 問題があります、フロントエンドの Client
api/values
インターフェイスが Authorize()
で設定されているため、アクセスする方法がありません。 🎜Client
を指定してアクセスを許可するにはどうすればよいでしょうか?例: [Authorize(ClientId = 'client_id_1')]
。 🎜🎜2. 解決策🎜🎜 [Authorize(ClientId = 'client_id_1')]
のような解決策はありませんが、[Authorize(Roles = 'admin')]
を使用できます。 >。 🎜🎜認証センターの ResourceOwnerPasswordValidator
コードは次のように変更されます: 🎜startup
構成は次のように変更されます🎜rrreee🎜API サービス インターフェイスは、次のように設定するだけで済みます: 🎜api/values code> インターフェイスは特定の <code>Role
を設定しませんが、各 Role
にはアクセスできます。 🎜以上がIdentityServer4 認証構成AllowedScopes インスタンスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。