Maison  >  Article  >  développement back-end  >  Configuration des autorisations IdentityServer4, instance AllowedScopes

Configuration des autorisations IdentityServer4, instance AllowedScopes

零下一度
零下一度original
2017-06-24 10:48:343453parcourir

1. Scénario commercial

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});
Les deux

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

Par exemple, le code de configuration d'un service d'interface dans le service

 : 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

  1. frontend

    et le backend Client doivent être autorisés pour accéder à l'interface Client : pas de problème. api/values

  2. Front-end

    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()

En fait, pour l'expliquer plus clairement, comment laisser le service API spécifier

pour autoriser l'accès ? Par exemple : Client. [Authorize(ClientId = 'client_id_1')]

2. Solution

Il n'y a pas de

solution, mais vous pouvez utiliser [Authorize(ClientId = 'client_id_1')]. [Authorize(Roles = 'admin')]

Le

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);
        }
    }
}
La

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());
L'interface du service API doit uniquement être configurée comme suit :

[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();
}
Il convient de noter que bien que l'interface

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn