ホームページ >バックエンド開発 >C#.Net チュートリアル >IdentityServer4 認証構成AllowedScopes インスタンス

IdentityServer4 認証構成AllowedScopes インスタンス

零下一度
零下一度オリジナル
2017-06-24 10:48:343475ブラウズ

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
上記の 2 つの api_name1 設定は、認証センターの scope 設定は API サービス全体です。フロントエンドとバックエンドなどの複数の <code>Client 設定があり、両方が api_name1 にアクセスする必要がある場合、いくつかの問題が発生します。が発生します。 🎜🎜たとえば、api_name1 サービスのインターフェイス サービス設定コード: 🎜
rrreee
🎜Authorize() 設定と説明認証センターが 2 つの クライアント (フロントエンドとバックエンド) および scope で構成されている場合は、認証後に api/values インターフェイスにアクセスする必要があります。どちらにも api_name1 が含まれており、次の 2 つの状況が発生します: 🎜
  1. 🎜フォアグラウンド Client とバックグラウンド Client code> では、すべて <code>api/values インターフェイスへのアクセスを許可する必要がありますが、問題ありません。 🎜
  2. 🎜フロントエンド クライアント にはアクセスするための承認が必要ありませんが、バックエンド クライアント にはアクセスするための承認が必要です: 問題があります、フロントエンドの Client api/values インターフェイスが Authorize() で設定されているため、アクセスする方法がありません。 🎜
🎜実際、よりわかりやすく説明すると、API サービスに Client を指定してアクセスを許可するにはどうすればよいでしょうか?例: [Authorize(ClientId = 'client_id_1')]。 🎜🎜2. 解決策🎜🎜 [Authorize(ClientId = 'client_id_1')] のような解決策はありませんが、[Authorize(Roles = 'admin')] を使用できます。 >。 🎜🎜認証センターの ResourceOwnerPasswordValidator コードは次のように変更されます: 🎜
rrreee
🎜 認証センターの startup 構成は次のように変更されます🎜rrreee🎜API サービス インターフェイスは、次のように設定するだけで済みます: 🎜
rrreee
🎜注意が必要ですつまり、api/values code> インターフェイスは特定の <code>Role を設定しませんが、各 Role にはアクセスできます。 🎜

以上がIdentityServer4 認証構成AllowedScopes インスタンスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。