IdentityServer4-Autorisierungskonfiguration AllowedScopes-Instanz

零下一度
Freigeben: 2017-06-24 10:48:34
Original
3456 Leute haben es durchsucht

1. Geschäftsszenario

Das Client in der IdentityServer4-Autorisierungskonfiguration AllowedScopes legt den spezifischen API-Site-Namen fest, der dem ApiName entspricht, der vom Benutzer festgelegt wurde:

//授权中心配置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});
Nach dem Login kopieren

Die beiden oben genannten api_name1-Konfigurationen müssen konsistent sein. Das Problem entsteht, weil die scope-Konfiguration des Autorisierungscenters der gesamte API-Dienst ist. Wenn wir mehrere Client-Konfigurationen haben, z Wenn es ein Frontend und ein Backend gibt und beide auf api_name1 zugreifen müssen, treten einige Probleme auf.

Zum Beispiel der Konfigurationscode eines Schnittstellendienstes im api_name1-Dienst:

[Authorize()]
[Route("api/values")]
[HttpGet]public IActionResult Get()
{return Ok();
}
Nach dem Login kopieren

Authorize()-Konfiguration, der angibt, dass die api/values-Schnittstelle Für den Zugriff ist eine Autorisierung erforderlich. Wenn das Autorisierungscenter mit zwei Client (Frontend und Backend) konfiguriert ist und beide scope api_name1 enthalten, gibt es jetzt zwei Situationen:

  1. Frontend< Sowohl 🎜> als auch das Backend Client müssen für den Zugriff auf die Client-Schnittstelle berechtigt sein: kein Problem. api/values

  2. Front-End

    erfordert keine Autorisierung für den Zugriff, und Back-End Client erfordert Autorisierung für den Zugriff: Es liegt ein Problem vor, das Front-End Client kann nicht darauf zugreifen, da die Client-Schnittstelle eingestellt ist api/values. Authorize()

Um es genauer zu erklären: Wie kann der API-Dienst tatsächlich

angeben, um den Zugriff zu autorisieren? Zum Beispiel: Client. [Authorize(ClientId = &#39;client_id_1&#39;)]

2. Lösung

Es gibt keine

Lösung, aber Sie können [Authorize(ClientId = &#39;client_id_1&#39;)] verwenden. [Authorize(Roles = &#39;admin&#39;)]

Der

-Code des Autorisierungszentrums wird wie folgt geändert: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);
        }
    }
}
Nach dem Login kopieren
Die

Konfiguration des Autorisierungszentrums wird wie folgt geändertstartup

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());
Nach dem Login kopieren
API-Service-Schnittstelle muss nur wie folgt konfiguriert werden:

[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();
}
Nach dem Login kopieren
Es ist zu beachten, dass zwar die

-Schnittstelle hat keinen spezifischen api/values-Satz, zugänglich für jeden Roles. Role

Das obige ist der detaillierte Inhalt vonIdentityServer4-Autorisierungskonfiguration AllowedScopes-Instanz. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage