c# - asp.net core 中的授权类型

标签 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)));  
 } 
}

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

最佳答案

声明是定义用户的东西,它是一个键值对。

年龄:30 | 性别:男 | 姓名:鲍勃·马利 | 邮箱:foo@kek.com

你明白了。然后,您可以根据声明和值(value)实现授权检查。

进一步

您可以定义一个策略,策略是您需要遵守才能获得访问权限的内容。它可以包含多个 claim 检查。

因此您可以制定一项政策:IsMaleAndOver18,要求用户有 2 个声明:Age,其中值超过 18 岁,Sex 为 Male。

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

关于c# - asp.net core 中的授权类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54158675/

相关文章:

azure - Azure Linux Web 应用程序上的 ASP.NET Core NodeServices

未调用 Laravel Gate 方法

c# - 在 XNA 中画一条永无止境的线

c# - Razor 页面链接忽略路由参数

c# - EventLog 实例与静态方法 - 偏好?

C#如何连接2个MP4文件

c# - 在从 ASP.NET Core Web 应用程序调用的动态发现的 .NET Core 类库中注入(inject)记录器的合适模式是什么?

c# - ASP.Net Core Serilog 如何在运行时读取日志文件

php - 如何在zend框架中直接输入url来限制学生和老师访问对方的页面?

javascript - Discord API 对于使用机器人 token 的所有查询返回 401