Le Client
dans la configuration de l'autorisation IdentityServer4 AllowedScopes
définit le nom du site API spécifique, qui est le ApiName
défini par l'utilisateur. Exemple de code :
//授权中心配置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});
configurations ci-dessus doivent être cohérentes. Le problème se pose car la configuration api_name1
du centre d'autorisation est l'ensemble du service API. Si nous avons plusieurs scope
configurations, telles. comme s'il y a un frontend et un backend, et que les deux doivent accéder à Client
, certains problèmes surgiront. api_name1
: configuration api_name1
[Authorize()] [Route("api/values")] [HttpGet]public IActionResult Get() {return Ok(); }
, indiquant que l'interface Authorize()
nécessite une autorisation d'accès, si le centre d'autorisation est configuré avec deux api/values
(frontend et backend), et que les deux Client
incluent scope
, il y aura maintenant deux situations : api_name1
et le backend Client
doivent être autorisés pour accéder à l'interface Client
: pas de problème. api/values
ne nécessite pas d'autorisation pour l'accès, et le back-end Client
nécessite une autorisation pour l'accès : Il y a un problème, le front-end Client
ne peut pas y accéder car l'interface Client
est paramétrée api/values
. Authorize()
pour autoriser l'accès ? Par exemple : Client
. [Authorize(ClientId = 'client_id_1')]
solution, mais vous pouvez utiliser [Authorize(ClientId = 'client_id_1')]
. [Authorize(Roles = 'admin')]
code du centre d'autorisation est modifié comme suit :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); } } }
configuration du centre d'autorisation est modifiée comme suitstartup
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());
[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(); }
n'a pas d'ensemble api/values
spécifique, Accessible à tous Roles
. Role
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!