首页 > 解决方案 > IdentityServer4 验证但不授权,因为 context.User = null,ASP.NET + Angular 8

问题描述

使用:

  1. 来自 VS Studio 2019 的模板 Angular + ASP.NET Core 应用程序
  2. 角 8.2.12
  3. .NET 5
  4. MySQL 后端

问题:

项目实施 IdentityServer4 进行身份验证/授权,但是当向 IDS4 实例添加证书时,授权失败,因为context.User返回null

启动.cs:

从证书存储中调用证书:

X509Certificate2 cert = null;
using (var certStore = new X509Store(StoreName.My, StoreLocation.LocalMachine))
{
    certStore.Open(OpenFlags.ReadOnly);
    // var certCollection = certStore.Certificates.Find(X509FindType.FindByThumbprint,"THUMBPRINT>, false);
    var certCollection = certStore.Certificates.Find(X509FindType.FindBySubjectName,"localhost", false);
    if (certCollection.Count > 0)
       cert = certCollection[0];
 }

在 IdentityServer4 上设置证书:

if(cert == null)
{
    services.AddIdentityServer()
        //.AddDeveloperSigningCredential()
        .AddSigningCredential(cert)
        .AddApiAuthorization<ApplicationUser, ApplicationDbContext>();
}
else
{
    services.AddIdentityServer()
        .AddSigningCredential(cert)
        .AddApiAuthorization<ApplicationUser, ApplicationDbContext>();
}

添加身份验证和授权:

services.AddAuthentication()                
    .AddIdentityServerJwt();

services.AddScoped<IAuthorizationHandler, UserAuthorizationHandler>();
services.AddAuthorization(options =>
{
      options.AddPolicy("default", policy =>
      {
            policy.RequireAuthenticatedUser();
            //To require the basic user_impersonation scope across the API, you can use:
            //policy.RequirePermissions(
            //    delegated: new[] { "user_impersonation" },
            //    application: new string[0]);
       });
       options.AddPolicy("LocalAuthorizationPolicy", policy => policy.Requirements.Add(new UserRequirement(CustomRoleTypes.SiteAdmin)));           
});

证书被正确找到并分配给 IDS4 实例。用户身份验证正确进行,用户被重定向到正确的位置。用户能够调用通用 - 非授权 - 控制器方法。

当控制器方法被控制器修饰时[Authorize]返回401错误。因为在上下文中无法识别用户并返回 null。(即AuthorizationHandlerContext以及IHttpContextAccessor返回 null for ClaimsPrincipal)当 IDS4 没有使用 SigningCredentials 实例化时,后者不会发生。

即使用时:

services.AddIdentityServer()   
    .AddApiAuthorization<ApplicationUser, ApplicationDbContext>();

一切正常...

我已经检查了user使用返回的LocalAuthorizationPolicy并确定请求上下文中是否存在user标识。

我已经搜索了许多站点以获取有关理想实现的演练,但到目前为止还没有找到解决方案。

我注意到有几篇文章建议将 IdentityServer 安装为自己的项目。但是还没有能够实现...

任何建议将不胜感激。

标签: asp.netangularidentityserver4.net-5

解决方案


推荐阅读