1

我正在关注此处此处的文档,以采用基于声明的安全方法。文档中的代码无法编译。

在这条线上

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

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

在此处输入图像描述

在尝试遵循此处更简单的示例时

按 F5 时出现如下错误:

在此处输入图像描述

某处有完整的工作示例吗?文档似乎半生不熟。

4

1 回答 1

2

那是因为它是为本示例构建的自定义类。

它就在您链接的页面中:

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());
于 2015-12-18T17:49:48.057 回答