我希望在ASP.NET 3.0 MVC应用程序中使用Windows身份验证,并从SQL数据库中提取角色以实现API安全。我将用类似的东西装饰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);
}
在这种情况下,这是一个很小但很常见的切换线路错误,顺序是UseAuthentication
(用户是谁)然后是UseAuthorization
(允许用户做什么)。这就解释了为什么授权不起作用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句