1

我正在關注文檔herehere以採用基於聲明的安全方法。文檔中的代碼不能編譯。MVC 6安全性添加策略不起作用

在此行中

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

我得到一個編譯時錯誤: 類型MinimumAgeRequirement不類型Authorization 存在這裏是一個截圖。

​​

雖然試圖遵循簡單的例子here

我得到一個錯誤的下方按F5:

enter image description here

有一個完整的工作示例地方?該文件似乎有一半。

回答

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()); 
+1

自定義類和它的處理程序已經存在。對不起,我忘了提前說過。即使如此,我在我的問題上面的更新屏幕截圖中出現錯誤。 'Authorization'類型上的'MinimumAgeHandler'如何可用?我沒有在'Authorization'類型上創建擴展方法。 – user20358

+1

原來'Authorization'是我跟蹤的文檔中的一個命名空間。刪除它並編譯。現在看看其他問題。 – user20358

+0

如果我的回答與您的原始問題相符,請不要忘記標記爲已回答。這將有助於未來用戶解決與您遇到的相同問題。 –