添加策略的MVC 6安全性不起作用

时间:2015-12-18 16:15:42

标签: asp.net-core-mvc authorize-attribute asp.net-authorization

我正在关注文档herehere,以了解基于声明的安全方法。文档中的代码无法编译。

在这一行

options.AddPolicy("Over21",
                          policy => policy.Requirements.Add(new Authorization.MinimumAgeRequirement(21)));
    });

我收到编译时错误: 类型MinimumAgeRequirement中不存在Authorization类型 这是截图。

enter image description here

尝试遵循更简单的示例here

我在点击F5时收到如下错误:

enter image description here

某处有完整的工作示例吗?文档似乎已经半成品了。

1 个答案:

答案 0 :(得分:1)

那是因为它是为这个例子构建的自定义类。

它位于page you linked

public class MinimumAgeRequirement : IAuthorizationRequirement
{
    public MinimumAgeRequirement(int age)
    {
        MinimumAge = age;
    }

    protected int MinimumAge { get; set; }
}

不要忘记创建你的处理程序:

public class MinimumAgeHandler : AuthorizationHandler<MinimumAgeRequirement>
{
    protected override void Handle(AuthorizationContext context, MinimumAgeRequirement requirement)
    {
        if (!context.User.HasClaim(c => c.Type == ClaimTypes.DateOfBirth &&
                                   c.Issuer == "http://contoso.com"))
        {
            return;
        }

        var dateOfBirth = Convert.ToDateTime(context.User.FindFirst(
            c => c.Type == ClaimTypes.DateOfBirth && c.Issuer == "http://contoso.com").Value);

        int calculatedAge = DateTime.Today.Year - dateOfBirth.Year;
        if (dateOfBirth > DateTime.Today.AddYears(-calculatedAge))
        {
            calculatedAge--;
        }

        if (calculatedAge >= MinimumAge)
        {
            context.Succeed(requirement);
        }
    }
}

您的最终代码应如下所示:

services.AddAuthorization(options =>
{
    options.AddPolicy("Over21",
                      policy => policy.Requirements.Add(new Authorization.MinimumAgeRequirement(21)));
});
services.AddInstance<IAuthorizationHandler>(new Authorization.MinimumAgeHandler());