.NET Core 中的鉴权授权正确方式

紫色薰衣草 2021-01-22 ⋅ 13 阅读

在开发Web应用程序时,安全是一个非常重要的考虑因素。在现代化的Web应用中,鉴权和授权是保护用户数据和资源的关键组成部分。在.NET Core中,我们有一些强大的工具来实现鉴权和授权,本文将介绍如何正确使用这些工具。

1.使用Identity进行身份验证和授权

Identity是.NET Core中一个非常强大的身份验证和授权框架。它提供了一系列易于使用的API来管理用户的身份验证和授权。以下是使用Identity进行身份验证和授权的一些正确方式:

a.配置Identity

在使用Identity之前,我们需要进行一些配置。我们可以通过在Startup.cs文件中的ConfigureServices方法中添加以下代码来配置Identity:

services.AddDefaultIdentity<IdentityUser>(options =>
{ 
    options.SignIn.RequireConfirmedAccount = true;
})
.AddEntityFrameworkStores<ApplicationDbContext>();

此代码将添加Identity服务,并将IdentityUser作为用户实体。您还可以根据需要更改选项。

b.使用Authorize属性

[Authorize]属性是Identity中用于授权的主要工具之一。您可以在控制器或操作方法上使用Authorize属性,以限制不允许访问未授权用户的资源。例如,以下代码将只允许已登录的用户访问某个控制器:

public class HomeController : Controller
{
    [HttpGet]
    [Authorize]
    public IActionResult Index()
    {
        // 你可以在这里执行只有授权用户才能执行的代码
        return View();
    }
}

c.自定义授权策略

Identity还允许我们自定义授权策略以满足特定需求。例如,我们可以创建一个自定义的授权要求,以限制只有管理员可以访问某些资源。以下是一个自定义权限要求的示例:

public class AdminRequirement : IAuthorizationRequirement
{
    // 这里可以定义自定义的授权要求
}

public class AdminHandler : AuthorizationHandler<AdminRequirement>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, AdminRequirement requirement)
    {
        if (context.User.IsInRole("Admin"))
        {
            context.Succeed(requirement);
        }
        else
        {
            context.Fail();
        }

        return Task.CompletedTask;
    }
}

要使用自定义的授权要求和处理程序,您可以在Startup.cs文件的ConfigureServices方法中进行配置:

services.AddAuthorization(options =>
{
    options.AddPolicy("AdminOnly", policy =>
    {
        policy.Requirements.Add(new AdminRequirement());
    });
});

services.AddSingleton<IAuthorizationHandler, AdminHandler>();

现在,您可以在控制器或操作方法上使用[Authorize(Policy = "AdminOnly")]属性来限制只有管理员角色的用户才能访问。

2.使用Token进行身份验证和授权

除了Identity之外,.NET Core还提供了一种使用Token进行身份验证和授权的灵活方式。通常,这被用于构建Web API应用程序。

a.配置Token验证

在使用Token进行身份验证和授权之前,我们需要在Startup.cs文件中配置Token验证:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"])),
            ValidIssuer = Configuration["Jwt:Issuer"],
            ValidAudience = Configuration["Jwt:Issuer"]
        };
    });

这个配置将验证Token的签发人、受众、过期时间和签名等信息。

b.生成和验证Token

生成和验证Token的过程可以在各种场景中使用。例如,登录时生成Token,然后将其发送给客户端,客户端以后的请求将在请求头中携带该Token。

以下是一个生成和签名Token的示例:

var claims = new[]
{
    new Claim(ClaimTypes.Name, "John Doe"),
    // 其他要求
};

var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var expires = DateTime.Now.AddDays(Convert.ToDouble(Configuration["Jwt:ExpireDays"]));

var token = new JwtSecurityToken(
    Configuration["Jwt:Issuer"],
    Configuration["Jwt:Issuer"],
    claims,
    expires: expires,
    signingCredentials: creds);

var encodedToken = new JwtSecurityTokenHandler().WriteToken(token);

要验证Token,您可以使用以下代码:

var tokenHandler = new JwtSecurityTokenHandler();
var validationParameters = new TokenValidationParameters
{
    ValidateIssuerSigningKey = true,
    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"])),
    ValidateIssuer = true,
    ValidIssuer = Configuration["Jwt:Issuer"],
    ValidateAudience = true,
    ValidAudience = Configuration["Jwt:Issuer"],
    ValidateLifetime = true,
    ClockSkew = TimeSpan.Zero
};

SecurityToken validatedToken;
var claimsPrincipal = tokenHandler.ValidateToken(token, validationParameters, out validatedToken);

c.使用[Authorize]属性和策略

类似于Identity,我们可以在控制器或操作方法上使用[Authorize]属性来限制只有授权用户才能访问资源。您还可以使用策略来自定义授权要求。

[HttpGet]
[Authorize]
public IActionResult Get()
{
    // 只有授权用户才能访问的代码
    return Ok();
}

[HttpGet]
[Authorize(Roles = "Admin")]
public IActionResult AdminOnly()
{
    // 只有管理员角色的用户才能访问的代码
    return Ok();
}

结论

在.NET Core中,鉴权和授权是确保Web应用程序安全性的关键组成部分。使用正确的方法和工具来实现鉴权和授权是非常重要的,本文介绍了如何使用Identity和Token来进行身份验证和授权,以保护用户数据和资源的安全。无论是使用Identity还是Token,您都可以根据自己的应用程序需求来选择适合的方法。希望这篇博客对您有所帮助。

参考文献:


全部评论: 0

    我有话说: