【发布时间】:2020-12-05 10:20:40
【问题描述】:
我正在使用带有 Windows 身份验证的 ASP.NET Core 3.1。如果我单独使用[Authorize],一切都很好,但是,如果我用[Authorize(Roles = "GlobalAdmin")] 装饰我的控制器,则授权失败。
这发生在我本地的开发人员中,以及在 Intranet 上部署之后。
我绝对分配了正确的角色,因为以下工作正常:
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, out bool someFailed)
System.Security.Principal.NTAccount.Translate(IdentityReferenceCollection sourceAccounts, Type targetType, bool forceSuccess)
System.Security.Principal.WindowsPrincipal.IsInRole(字符串角色)
Microsoft.AspNetCore.Authorization.Infrastructure.RolesAuthorizationRequirement+c__DisplayClass4_0.b__0(string r)
System.Linq.Enumerable.Any(IEnumerable source, Func谓词)
Microsoft.AspNetCore.Authorization.Infrastructure.RolesAuthorizationRequirement.HandleRequirementAsync(AuthorizationHandlerContext 上下文,RolesAuthorizationRequirement 要求)
Microsoft.AspNetCore.Authorization.AuthorizationHandler.HandleAsync(AuthorizationHandlerContext 上下文)
Microsoft.AspNetCore.Authorization.Infrastructure.PassThroughAuthorizationHandler.HandleAsync(AuthorizationHandlerContext 上下文)
Microsoft.AspNetCore.Authorization.DefaultAuthorizationService.AuthorizeAsync(ClaimsPrincipal 用户、对象资源、IEnumerable 要求)
Microsoft.AspNetCore.Authorization.Policy.PolicyEvaluator.AuthorizeAsync(AuthorizationPolicy 策略、AuthenticateResult authenticationResult、HttpContext 上下文、对象资源)
Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext 上下文)
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
【问题讨论】:
-
@CamiloTerevinto 完成!我在网上能找到的所有主要错误都是人们无法使用
IsInRole,但IsInRole对我来说很好用,我只是不明白为什么Authorize属性不起作用。 -
如果您没有得到答案,我会在当天晚些时候查看源代码以尝试找出差异
-
您的代码的属性为
[Authorization(Roles = "GlobalAdmin")],但文档显示为[Authorize(Roles = "GlobalAdmin")],您尝试过吗? Role-based authorization in ASP.NET Core -
@queue 抱歉,这是一个手动输入的错误,它实际上应该是用 [Authorize] 装饰的,我只是输入了“Authorization”,因为那是命名空间。今天早上我在谷歌上输入了大约 20 次,所以我很困惑!
-
@CamiloTerevinto 如果您能发现错误,我将不胜感激!我确定我之前已经创建并使用了这个确切的项目设置没有问题,但这可能是登录而不是 windows auth
标签: c# asp.net-core windows-authentication asp.net-core-3.1