我使用Identity Server 4实现了令牌服务器。
我向令牌服务器添加了一个自定义API端点,并在身份验证方面遇到困难。自定义端点是从ControllerBase继承的,并具有3种方法(GET,POST,DELETE)。
我打算使用在.NET Core中实现为HttpClient的凭据(服务器到服务器)的专用客户端从另一个API内调用自定义终结点。没有用户参与。
为了获取访问令牌,我使用IdentityModel DiscoveryClient和TokenEndpoint。
总而言之,到目前为止,我已经做了以下事情:
现在,当我使用带有访问令牌的HttpClient调用端点时,收到响应代码200(确定),但内容是身份服务器的登录页面。
documentation of Identity Server 4声明使用
services.AddAuthentication()
.AddIdentityServerAuthentication("token", isAuth =>
{
isAuth.Authority = "base_address_of_identityserver";
isAuth.ApiName = "name_of_api";
});
以及使用
[Authorize(AuthenticationSchemes = "token")]
不幸的是,编译器状态为找不到.AddIdentityServerAuthentication。我想念特殊的小点心吗?
到目前为止,我在令牌服务器上使用的nuget是:
找出该部分。 AddIdentityServerAuthentication缺少的nuget是:
在基于自定义范围的授权中苦苦挣扎。
有人知道如何配置安全性吗?
答案 0 :(得分:1)
使用ClientGrantTypes = client_credentials和您的api配置客户端,如下所示:
services
.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddIdentityServerAuthentication(options =>
{
options.Authority = "http://localhost:5000";
options.ApiName = "api.auth";
});
其中ApiName是资源的名称。请注意,资源!=作用域。在大多数示例中,资源名称等于作用域名称。但您的情况并非如此,资源名称为api.auth
,范围名称为api.auth.endpoint1
。
配置客户端以请求作用域。
var tokenClient = new TokenClient(disco.TokenEndpoint, clientId, secret);
var tokenResponse = await tokenClient.RequestClientCredentialsAsync("api.auth.endpoint1");
IdentityServer将查找资源名称,并将其作为听众(aud)添加到令牌中,同时将范围添加为具有范围类型的声明。
这应该足以使其工作。还要检查sample project。
答案 1 :(得分:0)
捆绑在一起的用于不同访问权限的自定义身份验证方案和基于范围的策略如下所示:
// Startup.ConfigureServices
services
.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddIdentityServerAuthentication("CustomAuthEndpointsAuthenticationScheme", options =>
{
options.Authority = "http://localhost:5000";
options.ApiName = "api.auth"; //IdentityServer4.Models.ApiResource.Name aka Audience
});
services.AddAuthorization(options =>
{
options.AddPolicy("Endpoint1Policy", policy => {
policy.AddAuthenticationSchemes(new string[] { "CustomAuthEndpointsAuthenticationScheme" });
policy.RequireScope("api.auth.endpoint1"); } ); //IdentityServer4.Models.Scope.Name
options.AddPolicy("Endpoint2Policy", policy => {
policy.AddAuthenticationSchemes(new string[] { "CustomAuthEndpointsAuthenticationScheme" });
policy.RequireScope("api.auth.endpoint2"); } ); //IdentityServer4.Models.Scope.Name
} );
// securing the custom endpoint controllers with different access rights
[Authorize(AuthenticationSchemes = "CustomAuthEndpointsAuthenticationScheme", Policy = "Endpoint1Policy")]
似乎不会干扰IdentityServer4默认终结点,也不会干扰ASP.NET Core身份验证部分。