Я работаю над приложением для интрасети, которое будет использовать Asp.Net Core 2.1 и проверку подлинности Windows.Я просто передаю данные из IIS, но хочу использовать для авторизации роли, хранящиеся в базе данных.
У меня есть класс IClaimsTransformeration, который получает роли из базы данных на основе идентификатора локальной сети и добавляетих в список утверждений с ключом роли.
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);
}
}
Я добавил IClaimsTransformation в мои службы в автозагрузке .cs
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 ERROR 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-адрес всей схемы.