【发布时间】: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