如何使用我的 IdentityServer 自身的身份验证和授权?

How Use Authentication and Authoriziation of my IdentityServer with itself?

我有一个名为 MyApi 的 Api,我使用另一个 asp.net 核心应用程序和 Identityserver4 来保护我的Api,现在我没有任何MyApi 中的问题但是,我想保存我的用户的 NationalCode,所以我应该将其保存在我的 IdentityServer 数据库中,但无法在我的 IdentityServer 项目中获取 UserId(使用 User.Identity.Name) ,我在之前的问题中遇到了同样的问题

现在我的 IdentityServer4 项目中遇到了这个问题,所以

我可以使用我的Api 令牌吗?或者我应该获取一个新令牌来向我的 idenittyserver4 项目发送请求?

如果我可以MyAPI token,我应该如何添加配置来解决问题?

如果我应该为我的 IdentityServer4 项目获取新令牌,我需要让用户重新登录吗?!!!

编辑

我在下面找到了教程 link 但我的问题还没有解决。

http://docs.identityserver.io/en/latest/topics/add_apis.html

我用以下方法为我的 IdentityDatabase 播种


public async Task AddIdenityServerApiToResources(IApplicationBuilder app)
        {
            using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
            {
                serviceScope.ServiceProvider.GetRequiredService<PersistedGrantDbContext>().Database.Migrate();
                var ccontext = serviceScope.ServiceProvider.GetRequiredService<ConfigurationDbContext>();
                ccontext.Database.Migrate();
                //=============================================================
                ccontext.ApiResources.Add(new ApiResource(IdentityServerConstants.LocalApi.ScopeName) {
                    UserClaims =
                    {
                        JwtClaimTypes.Name,
                        JwtClaimTypes.Subject,
                        JwtClaimTypes.Role,
                    }
                }.ToEntity());
                //Add ApiResource To Client's Scope
                var Clients = ccontext.Clients.Include(e => e.AllowedScopes);
                foreach (var item in Clients)
                {
                    item.AllowedScopes.Add(new IdentityServer4.EntityFramework.Entities.ClientScope() { Scope = IdentityServerConstants.LocalApi.ScopeName });
                }
                var Count = await ccontext.SaveChangesAsync();
                if (Count > 0)
                {
                }
            }
        }

在 IdentityServer4 startup.cs 配置服务

您应该将 api 视为需要由 idserver4 保护的任何其他 api。

含义:使用 AddAuthentication 和 AddJWTToken:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            options.Authority = "https:// idserver4 ";
            options.RequireHttpsMetadata = true;
            options.Audience = "api name";
            options.TokenValidationParameters = new TokenValidationParameters
            {
                NameClaimType = "name",
                RoleClaimType = "role"
            };
        });

在 API 控制器中:

使用 Authorize Attirbute 并像这样确定身份验证方案:

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]

我解决了下面的问题 link:

http://docs.identityserver.io/en/latest/topics/add_apis.html

但问题是我没有在控制器上使用 AuthorizeLocalApi.PolicyName 策略

[Route("localApi")]
[Authorize(LocalApi.PolicyName)]
public class LocalApiController : ControllerBase
{
    public IActionResult Get()
    {
        // omitted
    }
}

之后问题就解决了