>  기사  >  백엔드 개발  >  IdentityServer4 인증 구성 AllowedScopes 인스턴스

IdentityServer4 인증 구성 AllowedScopes 인스턴스

零下一度
零下一度원래의
2017-06-24 10:48:343415검색

1. 비즈니스 시나리오

IdentityServer4 인증 구성 ClientAllowedScopes는 사용자가 설정한 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,现在就会出现两种情况:

  1. 前台Client和后台Client,都需要授权后访问api/values接口:没有问题。

  2. 前台Client不需要授权后访问,后台Client需要授权后访问:有问题,前台Client没办法访问了,因为api/values接口设置了Authorize()

其实,说明白些,就是该如何让 API 服务指定Client授权访问?比如:[Authorize(ClientId = 'client_id_1')]

2. 解决方案

没有[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

rrreee
위의 두 api_name1 구성은 일관성이 있어야 합니다. 인증 센터의 범위 구성은 전체 API 서비스입니다. 프런트엔드와 백엔드 등 여러 <code>클라이언트 구성이 있고 둘 다 api_name1에 액세스해야 하는 경우 몇 가지 문제가 있습니다. 발생합니다. 🎜🎜예를 들어 api_name1 서비스의 인터페이스 서비스 구성 코드: 🎜
rrreee
🎜Authorize() 구성 및 설명 인증 센터가 두 개의 클라이언트(프런트엔드 및 백엔드)와 범위로 구성된 경우 api/values 인터페이스에 액세스해야 합니다. 둘 다 api_name1을 포함합니다. 이제 🎜
  1. 🎜Foreground Client 및 background Client라는 두 가지 상황이 발생합니다. code>, <code>api/values 인터페이스에 액세스하려면 모두 승인이 필요합니다. 문제 없습니다. 🎜
  2. 🎜프런트 클라이언트는 접근 승인이 필요하지 않으며, 백그라운드 클라이언트는 접근 승인이 필요합니다: 문제가 있습니다, 프론트 Desk Client api/values 인터페이스가 Authorize()로 설정되어 있으므로 접근할 수 있는 방법이 없습니다. 🎜
🎜실제로 좀 더 명확하게 설명하자면, API 서비스가 액세스 권한을 부여하기 위해 클라이언트를 지정하도록 하는 방법은 무엇입니까? 예: [Authorize(ClientId = 'client_id_1')]. 🎜🎜2. 해결 방법🎜🎜 [Authorize(ClientId = 'client_id_1')] 같은 해결 방법은 없지만 [Authorize(Roles = 'admin')]를 사용할 수 있습니다. >. 🎜🎜인증 센터의 ResourceOwnerPasswordValidator 코드는 다음과 같이 수정됩니다. 🎜
rrreee
🎜인증 센터의 시작 구성 🎜rrreee🎜API 서비스 인터페이스는 다음과 같이 수정됩니다. 다음과 같이 구성하면 됩니다. 🎜
rrreee
🎜주의해야 할 사항 즉, api/values code>인터페이스가 특정 <code>역할을 설정하지 않더라도 각 역할에 액세스할 수 있습니다. 🎜

위 내용은 IdentityServer4 인증 구성 AllowedScopes 인스턴스의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.