Я использую ASP.NET Core 3.1 с проверкой подлинности Windows. Если я использую только [Authorize]
, все в порядке, однако, если я украсил свой контроллер [Authorize(Roles = "GlobalAdmin")]
, авторизация не удалась.
Это происходит как в среде разработки на моем локальном компьютере, так и после развертывания в интрасети.
Мне определенно назначены правильные роли, потому что следующее работает нормально:
if(await _userManager.IsInRoleAsync(await _userManager.FindByNameAsync(User.Identity.Name), "GlobalAdmin"))
{
return View();
}
Но я не хочу делать это для каждого метода в моем контроллере, и я не могу использовать его в конструкторе на базовом контроллере, потому что User.Identity
возвращает null в конструкторе.
И используя следующее, var y
показывает мне мои правильные роли
var x = await _userManager.FindByNameAsync(User.Identity.Name);
var y = await _userManager.GetRolesAsync(x);
Раньше мне удавалось создать настраиваемое переопределение для атрибута Authorize
, и я выполнил свою собственную валидацию роли там, но ядро 3.1, похоже, изменило методы, поэтому их нет для переопределения.
Но почему атрибут [Authorize]
вообще не работает для моих ролей?
В моем стартапе есть
public void ConfigureServices(IServiceCollection services)
{
services.AddIdentity<IdentityUser, IdentityRole>()
.AddRoleManager<RoleManager<IdentityRole>>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.Configure<IdentityOptions>(options =>
{
options.User.AllowedUserNameCharacters =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-.\\";
options.User.RequireUniqueEmail = true;
});
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("MyConnString")));
services.AddControllersWithViews();
}
а также
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
//app.UseMiddleware<Helpers.ErrorHandlingMiddleware>();
app.UseDeveloperExceptionPage();
}
else
{
app.UseMiddleware<Helpers.ErrorHandlingMiddleware>();
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthentication();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
}
Вся трассировка стека выглядит так:
Win32Exception: доверительные отношения между этой рабочей станцией и основным доменом не удалось.
System.Security.Principal.NTAccount.TranslateToSids (IdentityReferenceCollection sourceAccounts, out bool someFailed)
System.Security.Principal.NTAccount.Translate (IdentityReferenceCollection sourceAccounts, Type targetType, outbool someFailed. .NTAccount.Translate (IdentityReferenceCollection sourceAccounts, Type targetType, bool forceSuccess)
System.Security.Principal.WindowsPrincipal.IsInRole (строковая роль)
Microsoft.AspNetCore.Authorization.Infrastructureplay.Roles_RolesAuthorization строка r)
System.Linq.Enumerable.Any (источник IEnumerable, Func ‹TSource, bool› предикат)
Microsoft.AspNetCore.Authorization.Infrastructure.RolesAuthorizationRequirement.HandleRequirementAsync (контекст AuthorizationHandlerContext, требование RolesAuthorization) /> Microsoft.AspNetCore.Authorization.AuthorizationHandler.HandleAsync (контекст AuthorizationHandlerContext)
Microsoft.AspNetCore.Authorization .Infrastructure.PassThroughAuthorizationHandler.HandleAsync (контекст AuthorizationHandlerContext)
Microsoft.AspNetCore.Authorization.DefaultAuthorizationService.AuthorizeAsync (ClaimsPrincipal пользователь, объектный ресурс, IEnumerable требования)
Microsoft.AuthorizePrincipal. policy, AuthenticateResult authenticationResult, контекст HttpContext, ресурс объекта)
Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke (контекст HttpContext)
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke (контекст HttpContext)
IsInRole
, ноIsInRole
отлично работает для меня, я просто не понимаю, почему атрибутAuthorize
не работает. - person jamheadart   schedule 05.12.2020[Authorization(Roles = "GlobalAdmin")]
, но в документации он указан как[Authorize(Roles = "GlobalAdmin")]
, вы пробовали это? Роль- авторизация на основе ASP.NET Core - person queue   schedule 05.12.2020IsInRole
, взяты из БД, но[Authorize]
должны использовать IIS (в которых нет ни одного определенного) - person jamheadart   schedule 06.12.2020[Authorize]
, потому что мне намного проще создавать пользователей и роли в базе данных, чем использовать AD. Я пробовалClaimsTransformation
полагаться исключительно на базу данных, используя существующую[Authorize]
, но мне все равно пришлось бы создавать группы в AD, чтобы она работала из-за ошибки. Так что, в конце концов, проще просто перехватитьOnAuthorization
метод и полностью игнорировать группы безопасности! : /: / - person jamheadart   schedule 07.12.2020