我正在寻找在ASP.NET 3.0 MVC应用程序中使用Windows身份验证的角色,这些角色是我从SQL数据库中提取的用于API安全性的角色。我将用[Authorize(Roles = "Admin")]
我在这里拥有很多东西,我是从这个网站上挑选的,但我只停留在最后一部分。 我可以看到该角色已应用于用户,但无法获得授权才能工作。
为此,我首先从ClaimsTransformer开始,它将用于通过声明将角色应用于我的用户。
ClaimsTransformer.cs
public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
{
//This sample will automatically apply the Admin role to the user
//In the real app, I will check the user against my DB and apply all roles (as claims) here
var ci = (ClaimsIdentity)principal.Identity;
var c = new Claim(ci.RoleClaimType, "Admin");
ci.AddClaim(c);
return await Task.FromResult(principal);
}
Startup.cs-ConfigureServices
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
//Register the ClaimsTransformer here
services.AddSingleton<IClaimsTransformation, ClaimsTransformer>();
//Use windows authentication
services.AddAuthentication(IISDefaults.AuthenticationScheme);
services.AddAuthorization();
}
Starup.cs-配置
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseAuthentication();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
DataController.cs
在API控制器中,我可以像这样设置未经授权的方法,并在检查User.IsInRole(“ Admin”);时看到显示为true的结果。
[HttpGet]
public async Task<IActionResult> GetData1()
{
var result = User.IsInRole("Admin");
return Ok(result);
}
但是,如果我像这样用[Authorize(Roles = "Admin")]
装饰控制器方法,则在对该方法的调用上会收到禁止响应。
[HttpGet]
[Authorize(Roles = "Admin")]
public async Task<IActionResult> GetData1()
{
var result = User.IsInRole("Admin");
return Ok(result);
}
答案 0 :(得分:1)
在这种情况下,这是一个很小但常见的切换线路错误,the order是UseAuthentication
(用户),然后是UseAuthorization
(允许用户执行的操作)。这就解释了为什么授权不起作用。