asp.net核心中的授权类型

时间:2019-01-12 10:24:27

标签: c# asp.net-core authorization

我对在项目中使用哪种授权类型感到困惑:基于声明的授权或基于策略的授权。 这取决于项目的安全设计吗?还是相同? 根据Microsoft文档,我们可以配置和使用声明,如下所示:

private async Task CreateUserAndClaim(IServiceProvider serviceProvider) 
{
var claimList = (await UserManager.GetClaimsAsync(user)).Select(p => p.Type);  
if (!claimList.Contains("DateOfJoing")){  
    await UserManager.AddClaimAsync(user, new Claim("DateOfJoing", "09/25/1984"));  
}  
}

,然后按以下方式使用此声明:

public void ConfigureServices(IServiceCollection services) 
{
 services.AddAuthorization(options =>  
{  
    options.AddPolicy("IsAdminClaimAccess", policy => policy.RequireClaim("DateOfJoing")); 
}

[Authorize(Policy = "IsAdminClaimAccess")]  
public IActionResult TestMethod1(){}

并配置并使用以下策略:

public class MinimumTimeSpendRequirement: IAuthorizationRequirement  
{
public MinimumTimeSpendRequirement(int noOfDays)  
{  
    TimeSpendInDays = noOfDays;  
}  

protected int TimeSpendInDays { get; private set; }  
}

public class MinimumTimeSpendHandler : AuthorizationHandler<MinimumTimeSpendRequirement>
{
...
var dateOfJoining = Convert.ToDateTime(context.User.FindFirst(  
        c => c.Type == "DateOfJoining").Value);  
}

public void ConfigureServices(IServiceCollection services)  
{
services.AddAuthorization(options =>  
 {  
    ...  
    ...  
    options.AddPolicy("IsAdminPolicyAccess", policy => policy.Requirements.Add(new MinimumTimeSpendRequirement(365)));  
 } 
}

,然后使用与我的控制器中的声明相同的政策。 如您所见,这两者都是一件事情。控制用户的加入日期。哪个更好?是否关注更好的速度和安全性? 还是看起来都一样?

1 个答案:

答案 0 :(得分:3)

索赔是定义用户的东西,它是一个键-值对。

年龄:30 | 性别:男性| 姓名:Bob Marley | 电子邮件:foo@kek.com

您得到图片。然后,您可以根据索赔和价值进行授权检查。

进一步

您可以定义一个策略,策略是您获得访问权限时必须遵守的内容。它可以包含多个索赔检查。

因此您可以制定一个政策:IsMaleAndOver18,要求用户有2条声明:年龄,其中值超过18,而性别是男性。

在实现时,它们在代码上可能看起来相似,但实际上它们是非常不同的。