我希望在使用ASP.NET 3.0 MVC应用程序中,通过SQL数据库中提取的角色来实现API安全性时,使用Windows身份验证。我会像这样为API控制器方法添加修饰:
为了做到这一点,我首先使用ClaimsTransformer,该转换器将用于通过声明向我的用户应用角色。 ClaimsTransformer.cs
[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);
}
UseAuthentication
(谁是用户),然后是UseAuthorization
(用户被允许做什么)。这就解释了为什么授权不起作用。 - user4864425