【发布时间】:2020-05-23 03:05:46
【问题描述】:
我有一个 ASP.NET Core 应用程序,我想在其中添加基于角色的身份验证。我正在使用 Windows 身份验证,因为它是一个 Intranet 应用程序。我已经有一个自定义数据库,其中包含坦率地说不映射到 IdentityFramework 中的字段的用户/角色。我可以通过 Context.User.Identity.Name 轻松获取登录用户的名称。然后,我想在自定义用户/角色表中查找用户,以便获取该用户的可用角色。然后我想使用在 Controller 或 Action 方法级别装饰的基于注释的身份验证过滤器。例如,[Authorize(roles="admin")]。
我可以通过关闭 Windows 身份验证并使用带有 Cookie 的表单身份验证来完成这项工作。在 AccountController 中,我运行如下代码:
using(LDAPConnection connection = new LDAPConnection(loginModel.UserName,loginModel.Password))
{
List<Claim> claims = new List<Claim> {
new Claim(ClaimTypes.Name, loginModel.UserName),
new Claim(ClaimTypes.Role, "admin")
};
ClaimsIdentity userIdentity = new ClaimsIdentity(claims,"login");
ClaimsPrincipal principal = new ClaimsPrincipal(userIdentity);
await HttpContext.SignInAsync(
CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(principal),
new AuthenticationProperties
{
IsPersistent = true,
ExpiresUtc = DateTime.Now.AddDays(200)
});
return Redirect("/");
}
然后我会将声明存储在 cookie 中。然后,当我用 [Authorize(roles="admin")] 装饰控制器时,我可以毫无问题地检索视图。授权有效。我想在不登录用户的情况下为 WindowsAuthentication 复制相同的功能。我尝试使用 ClaimsTransformer 并实现基于策略的授权,它有效。但是如果我用 [Authorize(roles="admin")] 装饰它,当我导航到操作方法时它会爆炸。这是 ClaimsTransformer:
public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
{
var identity = (ClaimsIdentity)principal.Identity;
List<Claim> claims = new List<Claim> {
new Claim(ClaimTypes.Name, identity.Name),
new Claim(ClaimTypes.Role, "admin")
};
identity.AddClaims(claims);
return Task.FromResult(principal);
}
为了使用 [Authorize(Roles="admin")] 工作,我缺少什么?顺便说一句,我目前正在使用 ASP.NET Core 2.2。
【问题讨论】:
标签: asp.net-core