asp.net - IdentityServer4 验证但不授权,因为 context.User = null,ASP.NET + Angular 8
问题描述
使用:
- 来自 VS Studio 2019 的模板 Angular + ASP.NET Core 应用程序
- 角 8.2.12
- .NET 5
- 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 安装为自己的项目。但是还没有能够实现...
任何建议将不胜感激。
解决方案
推荐阅读
- c++ - 在linux中检测分号作为命令行参数
- python - 在 Tornado,Python 中读取 excel 时出现 UnicodeDecodeError
- php - 如何找出 Symfony 主页空白页的原因?
- html - Selenium 在 Python3 中获取表格内容
- python - 在OCR opencv中检测字符之间的空格
- android - 注释处理器现在必须显式声明。- 编译器-1.1.1.jar (android.arch.lifecycle:compiler:1.1.1)
- php - 天数组到周期
- postgresql - 用光滑的scala将smallint转换为布尔值
- asp.net-mvc - 在方法中分配 Icollection
- neo4j - 基于节点属性的 Cypher 查询