如何在ASP.NET Core 2.0中使用基于视图的授权
我的ASP.NET Core 2.0 web应用程序中出现了奇怪的行为,授权在控制器级别通过,在视图级别失败 这是ASP.NET Core 2.0中的一个错误,还是我的代码中有错误 //控制器中的成功授权 信息:Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[1] 用户:(用户名)的授权已成功 //进入控制器 信息:Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1] 正在使用参数((null)执行操作方法HomeController.Index(Bams) )-ModelState是有效的 //失败在望 信息:Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2] 用户:(用户名)的授权失败 在Startup.cs中配置服务:如何在ASP.NET Core 2.0中使用基于视图的授权,asp.net,asp.net-core,asp.net-core-2.0,Asp.net,Asp.net Core,Asp.net Core 2.0,我的ASP.NET Core 2.0 web应用程序中出现了奇怪的行为,授权在控制器级别通过,在视图级别失败 这是ASP.NET Core 2.0中的一个错误,还是我的代码中有错误 //控制器中的成功授权 信息:Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[1] 用户:(用户名)的授权已成功 //进入控制器 信息:Microsoft.AspNetCore.Mvc.Internal.ControllerActionIn
services.AddAuthorization(options => {
options.AddPolicy("HasName", policy => policy.Requirements.Add(new HasNameRequirement()));
});
HomeController.cs:
[Authorize(Policy="HasName")]
public class HomeController : Controller
{
public IActionResult Index(){
return View();
}
}
要求:
public class HasNameRequirement : IAuthorizationRequirement {
public HasNameRequirement() { }
}
HasNameHandler:
public class HasNameHandler : AuthorizationHandler<HasNameRequirement>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, HasNameRequirement requirement)
{
var mvcContext = context.Resource as Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext;
if (mvcContext != null)
{
var name = mvcContext.HttpContext.User.Identity.Name;
if(name != null && name != "")
{
context.Succeed(requirement);
}
else
{
context.Fail();
}
}
return Task.CompletedTask;
}
}
_ViewImports.cshtml:
@using Microsoft.AspNetCore.Authorization
@inject IAuthorizationService AuthorizationService
问题出在HasNameHandler中
var mvcContext = context.Resource as Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext;
这行代码是为了使我的授权块仅在有MVC上下文时才起作用。由于视图没有访问MVC上下文的权限,因此基于视图的授权在未命中上下文的情况下完成了授权。success()
我删除了它,而是使用传递到方法中的AuthorizationContext
var name = context.User.Identity.Name;
if(name != null && name != ""){
context.Succeed(requirement);
}
else {
context.Fail();
}
在你看来,你为什么要做authZ?@Mardoxx的目的是要有某些链接和内容,只有那些有正当主张的人才能看到。我不希望显示指向用户管理页面的链接,如果控制器仍要将其锁定。在代码的实际版本中,我将有不同的策略。这只是测试基于视图的授权的功能。我愿意接受其他建议,但我不愿意为每项政策创建单独的观点。
var name = context.User.Identity.Name;
if(name != null && name != ""){
context.Succeed(requirement);
}
else {
context.Fail();
}