Для контекста я приступаю к новому проекту, использующему ASPNET Core 7. Я пытаюсь создать собственный обработчик авторизации для управления ролями. Эта часть, похоже, работает, она запускает мой пользовательский обработчик, но в пользовательском контексте нет информации. Никаких претензий нет ничего. Я выдаю себя за пользователей из базы данных. После прочтения документации из того, что я понимаю, проблема заключается в том, что мне нужно использовать AddIdentity или AddIdentityCore и добавить это к службам, я нашел примеры этого, но никогда не внутри этого типа встроенных лесов. Таким образом, добавление этого в блок configureservices, похоже, вызывает ошибку вне области видимости.
System.AggregateException: «Некоторые службы не могут быть созданы (ошибка при проверке дескриптора службы «ServiceType: Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory
1[Microsoft.AspNetCore.Identity.IdentityUser] Lifetime: Scoped ImplementationType: Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory
1[Microsoft.AspNetCore.Identity.IdentityUser]»: невозможно разрешить службу для типа « Microsoft.AspNetCore.Identity.IUserStore1[Microsoft.AspNetCore.Identity.IdentityUser]' while attempting to activate 'Microsoft.AspNetCore.Identity.UserManager
1[Microsoft.AspNetCore.Identity.IdentityUser].) (Ошибка при проверке дескриптора службы ServiceType: Microsoft.AspNetCore.Identity.UserManager1[Microsoft.AspNetCore.Identity.IdentityUser] Lifetime: Scoped ImplementationType: Microsoft.AspNetCore.Identity.UserManager
1[Microsoft.AspNetCore.Identity.IdentityUser]' : Не удалось разрешить службу для типа "Microsoft.AspNetCore.Identity.IUserStore1[Microsoft.AspNetCore.Identity.IdentityUser]' while attempting to activate 'Microsoft.AspNetCore.Identity.UserManager
1[Microsoft.AspNetCore.Identity.IdentityUser]".)'
Не уверен, как я могу сохранить текущую структуру «WebHostBuilder» и включить Identity, чтобы мои утверждения были заполнены.
//program.cs
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseIISIntegration().UseStartup<Startup>();
})
.ConfigureServices((hostContext, services) =>
{
services.AddSingleton<IAuthorizationHandler, RoleHandler>();
services.AddAuthorization(options =>
{
options.AddPolicy("Roles", policy =>
{
policy.Requirements.Add(new RoleAuthRequirement { Role = "Role1" });
policy.Requirements.Add(new RoleAuthRequirement { Role = "Role2" });
policy.Requirements.Add(new RoleAuthRequirement { Role = "Role3" });
});
});
services.AddIdentity<IdentityUser, IdentityRole>(); //throws out of scope ERROR!! same as AddIdentityCore
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options => {
options.LoginPath = new PathString("/login");
options.AccessDeniedPath = new PathString("/denied");
});
});
При входе в систему я беру роль пользователя из базы данных и добавляю ее как претензию.
//Login Action
var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, userObj.UserId.ToString()));
identity.AddClaim(new Claim(ClaimTypes.Name, userObj.UserName));
identity.AddClaim(new Claim(ClaimTypes.Role, userObj.Role));
var principal = new ClaimsPrincipal(identity);
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal);
После этого в моем обработчике авторизации я не вижу никаких утверждений, что пользователь является нулевым. Я также не могу использовать User.IsInRole() для проверки, поскольку контекст пользователя по существу пуст.
public class RoleHandler : AuthorizationHandler<RoleAuthRequirement>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, RoleAuthRequirement requirement)
{
var requiredRole = requirement.Role;
var hasRole = context.User.IsInRole(requiredRole);
if (hasRole)
{
context.Succeed(requirement);
}
else
{
context.Fail(new AuthorizationFailureReason(this, $"User Role {requirement.Role} missing"));
}
return Task.CompletedTask;
}
}
Вы не зарегистрировали dbcontext, который требуется в Identity, попробуйте зарегистрировать Identity, как показано ниже:
services.AddDbContext<SomeContext>(options =>
options.UseSqlServer(connectionString));
services.AddIdentity<IdentityUser, IdentityRole>().AddEntityFrameworkStores<SomeContext>();
И после проверки ваших кодов кажется, что вы пытаетесь войти в систему с помощью CookieAuthentication (не Identity). Действительно ли Identity необходима на вашей стороне?
В итоге получилось так, что, чтобы не использовать таблицы утверждений таблиц идентификаторов asp.net и т. д., роли были просто в простой пользовательской таблице, мне пришлось использовать AddIdentityCore, а затем смоделировать UserStore и IdentityRoleStore. Я впервые попробовал Chat GPT, и он решил все мои проблемы с поразительной точностью. Все остались без работы за 5 лет! ржу не могу.