Maison >développement back-end >Tutoriel C#.Net >Configuration des autorisations IdentityServer4, instance AllowedScopes
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!