【问题标题】:How to use View Based Authorization in ASP.NET Core 2.0如何在 ASP.NET Core 2.0 中使用基于视图的授权
【发布时间】:2017-05-18 20:39:37
【问题描述】:

我的 ASP.NET Core 2.0 Web 应用程序出现了奇怪的行为,其中授权在控制器级别通过而在视图级别失败。

这是 ASP.NET Core 2.0 中的错误还是我在代码中做错了什么?

//Controller中授权成功

信息:Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[1] 用户授权成功:(用户名)。

//进入控制器

信息:Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1] 执行带有参数的动作方法 HomeController.Index (Bams) ((null) ) - 模型状态有效

...

//视图失败

信息: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;
    }
}

_Layout.cshtml:

@if (await AuthorizationService.AuthorizeAsync(User, "HasName"))
{
    ...
}

_ViewImports.cshtml:

@using Microsoft.AspNetCore.Authorization
@inject IAuthorizationService AuthorizationService

【问题讨论】:

  • 在你看来为什么要做authZ?
  • @Mardoxx 这样做的目的是,某些链接和内容只有拥有正确声明的人才能看到。如果控制器无论如何都要锁定它们,我不希望显示用户管理页面的链接。在代码的实际版本中,我会有不同的策略。这只是测试基于视图的授权的功能。我愿意接受其他建议,但我不愿意为每项政策创建单独的视图。

标签: asp.net asp.net-core asp.net-core-2.0


【解决方案1】:

问题出在 HasNameHandler 中。

var mvcContext = context.Resource as Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext;

这一行是为了让我的授权块仅在存在 MVC 上下文时才有效。因为视图无权访问 MVC 上下文,所以基于视图的授权完成了授权而没有命中 context.Succeed()。

我删除了它,而是使用了传递给方法的 AuthorizationContext。

var name = context.User.Identity.Name;
if(name != null && name != ""){
    context.Succeed(requirement);
}
else {
    context.Fail();
}

【讨论】:

    猜你喜欢
    • 2018-12-28
    • 2018-06-27
    • 2018-12-25
    • 2018-04-03
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多