【发布时间】: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