Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在ASP.NET Core 2.0中使用基于视图的授权_Asp.net_Asp.net Core_Asp.net Core 2.0 - Fatal编程技术网

如何在ASP.NET Core 2.0中使用基于视图的授权

如何在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

我的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中配置服务:

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();
}