我正在开发一个使用 Asp.Net Core 2.1 和 Windows 身份验证的 Intranet 应用程序。我从 IIS 获得通过就好了,但我想使用存储在数据库中的角色进行授权。
我有一个 IClaimsTransformeration 类,它根据 LAN Id 从数据库中获取角色,并使用角色键将它们添加到声明列表中。
public class MyClaimsTransformer : IClaimsTransformation
{
private readonly IUnitOfWorkMtuSecurity _unitOfWork;
public MyClaimsTransformer(IUnitOfWorkMtuSecurity unitOfWork)
{
_unitOfWork = unitOfWork;
}
// Each time HttpContext.AuthenticateAsync() or HttpContext.SignInAsync(...) is called the claims transformer is invoked. So this might be invoked multiple times.
public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
{
var identity = principal.Identities.FirstOrDefault(x => x.IsAuthenticated);
if (identity == null) return principal;
//var user = await _userManager.GetUserAsync(principal);
var user = identity.Name;
if (user == null) return principal;
//Get user with roles from repository.
var dbUser = _unitOfWork.UserInformations.GetUserWithRoles(user);
// Inject DbRoles into Claims list
foreach (var role in dbUser.UserInformationUserRoles.Select((r=>r.UserRole)))
{
var claim = new Claim(ClaimTypes.Role, role.Name);
identity.AddClaim(claim);
}
return new ClaimsPrincipal(identity);
}
}
我在 startup.cs 中将 IClaimsTransformation 添加到我的服务中
services.AddScoped<IClaimsTransformation, MyClaimsTransformer>();
然后我将属性添加到我的控制器
[Authorize(Roles = "Administrator")]
当我运行我的应用程序时,我收到以下错误:
处理请求时发生未处理的异常。InvalidOperationException:没有指定 authenticationScheme,也没有找到 DefaultForbidScheme。Microsoft.AspNetCore.Authentication.AuthenticationService.ForbidAsync(HttpContext 上下文、字符串方案、AuthenticationProperties 属性)
在 startup.cs 我将以下内容添加到服务中
services.AddAuthentication(IISDefaults.AuthenticationScheme);
这摆脱了错误,但无论我得到什么 403 错误。
您无权查看此页面。HTTP 错误 403
当我查看 MyClaimsTransformer 的返回值时,我可以看到管理员角色已添加到声明列表中,但无论如何我都会收到 403 错误。
有人对我所缺少的有什么建议吗?
如果我在视图中使用以下语法,它将在视图级别工作:
@if (User.HasClaim("http://schemas.microsoft.com/ws/2008/06/identity/claims/role", "Administrator"))
{
<li><a asp-area="" asp-controller="UserInformationAdmin" asp-action="Index">Admin</a></li>
}
不过,我必须指定整个架构 url。