gpt4 book ai didi

asp.net-core - 如何覆盖默认的 Windows Authentiation ClaimsPrincipal User 和 Authorize Controller 方法属性

转载 作者:行者123 更新时间:2023-12-02 20:18:53 25 4
gpt4 key购买 nike

我有一个正在运行的 ASP.NET Core 网站,该网站使用 ASP.NET Identity 个人用户身份验证,并具有用户和角色的 ASP.NET Identity 表。

现在有些用户希望使用 Windows 身份验证而不是用户名/密码。

我可以部署网站的副本,只需调整 web.config 并更改 aspNetCore 标记属性

forwardWindowsAuthToken="false"

forwardWindowsAuthToken="true"

我想对现有个人用户帐户网站和 Windows 身份验证网站使用相同的代码库。

这意味着我将在 IIS 中拥有两个网站。我在 web.config 中使用 forwardWindowsAuthToken="false" (个人用户帐户)部署一个另一个是 forwardWindowsAuthToken="true" (Windows 身份验证)

我有一个属性可以扩展 ASP.NET Identity 个人用户帐户

 public class ApplicationUser : IdentityUser
{
[StringLength(50)]
public string DomainUserName { get; set; }
}

然后我在数据库中添加表上的唯一约束

CREATE UNIQUE NONCLUSTERED INDEX AspNetUsers_DomainUserName_Constraint
ON [AspNetUsers](DomainUserName)
WHERE DomainUserName IS NOT NULL;

对于 Windows 身份验证站点,我需要以某种方式从个人用户帐户身份表加载 ClaimsPrincipal 用户,或者能够覆盖个人 ClaimsPrincipal 用户方法和函数以在现有 ASP.Identity 表中查找角色,而不是使用域组作为角色。

我可以使用 User.Identity.Name 它为我提供了我的域名,然后使用它通过 Entity Framework Code First 查询我的 aspnetusers 表以获取任何用户信息

我需要现有的 Controller 方法属性,例如 [Authorize(Roles = "Admin")] 方法,以便使用数据库中的 AspNetRoles 组而不是域组在两个站点中继续以相同的方式工作作为角色。

如何覆盖 [Authorize(Roles = "Admin")] Controller 方法属性来查询数据库,或者将 Controller ClaimsPrincipal Windows User 替换为我通过查询 aspnetusers 获得的自己的用户 table 。

或者以某种方式替换 Windows 部署站点的中间件。

我当前的 Startup.cs

 services.AddIdentity<ApplicationUser, ApplicationRole>(options =>{})
.AddEntityFrameworkStores<MyDbContext, Guid>()
.AddDefaultTokenProviders();

最佳答案

我有同样的要求,从我的角度来看,不可能正确混合 Windows 身份验证和个人帐户。

启用 Windows 身份验证时,角色必须由 Windows/AD 组管理。您可以实现 IClaimsTransformation 接口(interface),该接口(interface)允许从 HTTP 请求拦截身份用户并将其添加到从数据库获取的角色,但这会在我的情况下创建 AD 检测到的安全漏洞。我必须使用角色以外的特定声明来解决这个问题,因此我的授权属性检查策略基于声明而不是角色。

从我的角度来看,管理 Windows 身份验证和个人帐户身份验证的最佳方法是拥有 2 个身份验证服务,一个用于 Windows,另一个用于个人帐户,每个身份验证服务都会生成一个资源接受的 token (例如 JWT)服务。

现在,为了回答您的问题,实现接口(interface) IClaimsTransformation 并将其添加到startup.cs文件中:

services.AddSingleton<IClaimsTransformation, MyConcreateClaimsTransformer>();

您可以从 IClaimsTransformation 类获取 ClaimPrincipal 并添加从数据库检索到的声明。

关于asp.net-core - 如何覆盖默认的 Windows Authentiation ClaimsPrincipal User 和 Authorize Controller 方法属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41157571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com