【问题标题】:How to override the default Windows Authentiation ClaimsPrincipal User and Authorize Controller method attributes如何覆盖默认的 Windows Authentiation ClaimsPrincipal User 和 Authorize Controller 方法属性
【发布时间】:2018-04-16 17:20:54
【问题描述】:

我有一个可用的 ASP.NET Core 网站,它使用 ASP.NET 身份个人用户身份验证,并有用户和角色的 ASP.NET 身份表。

现在有些用户想使用 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,它给了我我的域名,然后使用它来查询我的 aspnetusers 表,并使用 Entity Framework Code First 获取任何用户信息

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

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

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

我当前的 Startup.cs

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

【问题讨论】:

  • 您可以随时设置forwardWindowsAuthToken="true",真正重要的是是否在 IIS 中为该站点打开了 Windows 身份验证。
  • 不会将 Identity Core 数据库用于角色和访问权限以及它对应的 ApplicationUser 用户。我想利用那个代码库。
  • 我并没有说它会解决你的主要问题,我只是指出你不需要有条件地设置forwardWindowsAuthToken,你可以一直保持开启。

标签: asp.net-core asp.net-core-mvc asp.net-core-identity


【解决方案1】:

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

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

在我看来,管理 windows 身份验证和个人帐户身份验证的最佳方法是拥有 2 个身份验证服务,一个用于 windows,另一个用于个人帐户,每个身份验证服务都会生成一个由 ressource 接受的令牌(例如 JWT)服务。

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

services.AddSingleton<IClaimsTransformation, MyConcreateClaimsTransformer>();

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多