.Net Core官方JWT授权验证的全过程

下面是关于“.Net Core官方JWT授权验证的全过程”的完整攻略,包含两个示例说明。

简介

JSON Web Token(JWT)是一种用于安全地传输信息的开放标准。在.NET Core中,我们可以使用官方的JWT授权验证来实现身份验证和授权。

JWT的基本概念

在使用JWT之前,我们需要了解一些基本概念:

  • Header:JWT的头部,用于描述JWT的元数据。
  • Payload:JWT的负载,用于存储实际的数据。
  • Signature:JWT的签名,用于验证JWT的完整性和真实性。

JWT的使用方法

在.NET Core中,我们可以按照以下步骤来使用JWT:

1. 安装Microsoft.AspNetCore.Authentication.JwtBearer

我们可以使用NuGet包管理器来安装Microsoft.AspNetCore.Authentication.JwtBearer。可以使用以下命令来安装Microsoft.AspNetCore.Authentication.JwtBearer:

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

2. 配置JWT

我们可以在appsettings.json文件中配置JWT。可以使用以下代码来配置JWT:

{
  "Jwt": {
    "Issuer": "MyIssuer",
    "Audience": "MyAudience",
    "Key": "MySecretKey"
  }
}

在上面的代码中,我们配置了JWT的Issuer、Audience和Key。

3. 添加JWT授权验证

我们可以在Startup类中添加JWT授权验证。可以使用以下代码来添加JWT授权验证:

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

    services.AddControllers();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseAuthentication();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

在上面的代码中,我们使用AddAuthentication方法来添加JWT授权验证,并使用AddJwtBearer方法来配置JWT授权验证的选项。

4. 生成JWT

我们可以使用以下代码来生成JWT:

public string GenerateJwtToken(User user)
{
    var tokenHandler = new JwtSecurityTokenHandler();
    var key = Encoding.ASCII.GetBytes(Configuration["Jwt:Key"]);
    var tokenDescriptor = new SecurityTokenDescriptor
    {
        Subject = new ClaimsIdentity(new Claim[]
        {
            new Claim(ClaimTypes.Name, user.Username),
            new Claim(ClaimTypes.Role, user.Role)
        }),
        Expires = DateTime.UtcNow.AddDays(7),
        SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
    };
    var token = tokenHandler.CreateToken(tokenDescriptor);
    return tokenHandler.WriteToken(token);
}

在上面的代码中,我们使用JwtSecurityTokenHandler类来生成JWT,并使用SecurityTokenDescriptor类来配置JWT的选项。

5. 验证JWT

我们可以使用以下代码来验证JWT:

[Authorize]
[HttpGet]
public IActionResult Get()
{
    var identity = HttpContext.User.Identity as ClaimsIdentity;
    var username = identity.FindFirst(ClaimTypes.Name)?.Value;
    var role = identity.FindFirst(ClaimTypes.Role)?.Value;
    return Ok(new { Username = username, Role = role });
}

在上面的代码中,我们使用Authorize特性来标记需要验证JWT的API,并使用HttpContext.User.Identity属性来获取JWT的信息。

示例

示例1:生成和验证JWT

在本示例中,我们将演示如何使用JWT来生成和验证JWT。我们可以按照以下步骤来实现:

  1. 创建ASP.NET Core Web API项目:

我们可以使用Visual Studio创建一个名为"JwtExample"的ASP.NET Core Web API项目。

  1. 安装Microsoft.AspNetCore.Authentication.JwtBearer:

我们可以使用NuGet包管理器来安装Microsoft.AspNetCore.Authentication.JwtBearer。可以使用以下命令来安装Microsoft.AspNetCore.Authentication.JwtBearer:

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
  1. 配置JWT:

我们可以在appsettings.json文件中配置JWT。可以使用以下代码来配置JWT:

{
  "Jwt": {
    "Issuer": "MyIssuer",
    "Audience": "MyAudience",
    "Key": "MySecretKey"
  }
}

在上面的代码中,我们配置了JWT的Issuer、Audience和Key。

  1. 添加JWT授权验证:

我们可以在Startup类中添加JWT授权验证。可以使用以下代码来添加JWT授权验证:

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

    services.AddControllers();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseAuthentication();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

在上面的代码中,我们使用AddAuthentication方法来添加JWT授权验证,并使用AddJwtBearer方法来配置JWT授权验证的选项。

  1. 生成JWT:

我们可以创建一个名为"JwtController"的Controller,并添加以下代码:

[Route("api/[controller]")]
[ApiController]
public class JwtController : ControllerBase
{
    private readonly IConfiguration _configuration;

    public JwtController(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    [HttpPost]
    public IActionResult Post([FromBody] User user)
    {
        if (user == null)
        {
            return BadRequest("Invalid client request");
        }

        if (user.Username == "admin" && user.Password == "admin")
        {
            var tokenString = GenerateJwtToken(user);
            return Ok(new { Token = tokenString });
        }

        return Unauthorized();
    }

    private string GenerateJwtToken(User user)
    {
        var tokenHandler = new JwtSecurityTokenHandler();
        var key = Encoding.ASCII.GetBytes(_configuration["Jwt:Key"]);
        var tokenDescriptor = new SecurityTokenDescriptor
        {
            Subject = new ClaimsIdentity(new Claim[]
            {
                new Claim(ClaimTypes.Name, user.Username),
                new Claim(ClaimTypes.Role, "Admin")
            }),
            Expires = DateTime.UtcNow.AddDays(7),
            SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
        };
        var token = tokenHandler.CreateToken(tokenDescriptor);
        return tokenHandler.WriteToken(token);
    }
}

在上面的代码中,我们创建了一个名为JwtController的Controller,并在Post方法中生成JWT。

  1. 验证JWT:

我们可以创建一个名为"ValuesController"的Controller,并添加以下代码:

[Authorize]
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    [HttpGet]
    public IActionResult Get()
    {
        var identity = HttpContext.User.Identity as ClaimsIdentity;
        var username = identity.FindFirst(ClaimTypes.Name)?.Value;
        var role = identity.FindFirst(ClaimTypes.Role)?.Value;
        return Ok(new { Username = username, Role = role });
    }
}

在上面的代码中,我们创建了一个名为ValuesController的Controller,并使用Authorize特性来标记需要验证JWT的API。

示例2:使用自定义Claim验证JWT

在本示例中,我们将演示如何使用自定义Claim来验证JWT。我们可以按照以下步骤来实现:

  1. 创建ASP.NET Core Web API项目:

我们可以使用Visual Studio创建一个名为"JwtCustomClaimExample"的ASP.NET Core Web API项目。

  1. 安装Microsoft.AspNetCore.Authentication.JwtBearer:

我们可以使用NuGet包管理器来安装Microsoft.AspNetCore.Authentication.JwtBearer。可以使用以下命令来安装Microsoft.AspNetCore.Authentication.JwtBearer:

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
  1. 配置JWT:

我们可以在appsettings.json文件中配置JWT。可以使用以下代码来配置JWT:

{
  "Jwt": {
    "Issuer": "MyIssuer",
    "Audience": "MyAudience",
    "Key": "MySecretKey"
  }
}

在上面的代码中,我们配置了JWT的Issuer、Audience和Key。

  1. 添加JWT授权验证:

我们可以在Startup类中添加JWT授权验证。可以使用以下代码来添加JWT授权验证:

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

    services.AddControllers();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseAuthentication();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

在上面的代码中,我们使用AddAuthentication方法来添加JWT授权验证,并使用AddJwtBearer方法来配置JWT授权验证的选项,并使用RoleClaimType属性来指定自定义Claim的名称。

  1. 生成JWT:

我们可以创建一个名为"JwtController"的Controller,并添加以下代码:

[Route("api/[controller]")]
[ApiController]
public class JwtController : ControllerBase
{
    private readonly IConfiguration _configuration;

    public JwtController(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    [HttpPost]
    public IActionResult Post([FromBody] User user)
    {
        if (user == null)
        {
            return BadRequest("Invalid client request");
        }

        if (user.Username == "admin" && user.Password == "admin")
        {
            var tokenString = GenerateJwtToken(user);
            return Ok(new { Token = tokenString });
        }

        return Unauthorized();
    }

    private string GenerateJwtToken(User user)
    {
        var tokenHandler = new JwtSecurityTokenHandler();
        var key = Encoding.ASCII.GetBytes(_configuration["Jwt:Key"]);
        var tokenDescriptor = new SecurityTokenDescriptor
        {
            Subject = new ClaimsIdentity(new Claim[]
            {
                new Claim(ClaimTypes.Name, user.Username),
                new Claim("Role", "Admin")
            }),
            Expires = DateTime.UtcNow.AddDays(7),
            SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
        };
        var token = tokenHandler.CreateToken(tokenDescriptor);
        return tokenHandler.WriteToken(token);
    }
}

在上面的代码中,我们创建了一个名为JwtController的Controller,并在Post方法中生成JWT,并使用自定义Claim来指定用户的角色。

  1. 验证JWT:

我们可以创建一个名为"ValuesController"的Controller,并添加以下代码:

[Authorize(Roles = "Admin")]
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    [HttpGet]
    public IActionResult Get()
    {
        var identity = HttpContext.User.Identity as ClaimsIdentity;
        var username = identity.FindFirst(ClaimTypes.Name)?.Value;
        var role = identity.FindFirst("Role")?.Value;
        return Ok(new { Username = username, Role = role });
    }
}

在上面的代码中,我们创建了一个名为ValuesController的Controller,并使用Authorize特性来标记需要验证JWT的API,并使用Roles属性来指定需要验证的角色,使用自定义Claim来获取用户的角色。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:.Net Core官方JWT授权验证的全过程 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • 阅读【现代网络技术 SDN/NFV/QOE 物联网和云计算】 第一章

    本人打算阅读这本书来了解物联网和云计算的基础架构和设计原理。特作笔记如下: 作者: William  Stallings 本书解决的主要问题: 由单一厂商例如IBM向企业或者个人提供IT产品和服务,包括计算机软件,硬件,通信和网络设备服务。 这个时代已经一去不复返 目前用户和企业面对是复杂,异构,多样的环境,要求复杂,先进,更详细的解决方案。而云计算,大数据…

    云计算 2023年4月11日
    00
  • 价值100亿美元!微软刚刚击败亚马逊,拿下美国国防部十年云计算基建订单

    大数据文摘授权编译自《纽约时报》编译:李雷、曹培信、刘俊寰 为期10年,价值100亿美元。 经过长达一年的竞标,微软接连击败了谷歌、IBM、Oracle和亚马逊,拿下了美国国防部云计算这宝贵的一单。 上周五,美国国防部发布了官方声明,价值100亿美元的大型云计算合同“联合企业国防基建”(Joint Enterprise Defense Infrastruct…

    云计算 2023年4月12日
    00
  • 阿里云EMR计算速度提升2.2倍 连续两年打破大数据领域最难竞赛世界纪录!

    4月26日,大数据领域权威竞赛TPC-DS公布了最新结果,阿里云作为全球唯一入选的云计算公司获得第一。值得一提的是,去年阿里云EMR首次打破该竞赛纪录,成为全球首个通过TPC认证的公共云产品。今年在这一基础上,EMR的计算速度提升了2.2倍,性能指标(QphDS)首次超过一千万分,是友商的商业大数据产品3.5倍。同时,E-MapReduce继续保持数据处理能…

    云计算 2023年4月13日
    00
  • 第五届云计算大会······我走了

    伴随着隆隆的地铁声·····我们离开了国家会议中心!回想起这几天的“兴奋之旅”真是无比震撼! 2013.6.5第五届中国云计算大会在北京国家会议中心召开。软件工程系CSDN带领11、12级学生参加了此次的大会。 此次大会的主题是大数据大带宽。相较与往年的大主题是一个质的超越。在盛大的开幕仪式结束之后,李德毅院士的位置服务课题将大会带入高潮,迎来了到场嘉宾的热…

    云计算 2023年4月12日
    00
  • 致力于打造下一代去中心化云计算底层操作系统的BHP, 企图打破算力垄断

    云计算作为一种把许多计算资源集合起来,通过软件实现自动化管理,让计算能力如同水电一样让所有人简单取用的商业模式,有效降低了许多中小企业、初创公司的运营成本,不再需要建立自己的机房,同时也为 AWS、Google Cloud、阿里云等巨头带来了丰厚的利润。 但云计算不断发展的同时也带来了算力垄断的问题,一方面,全球网络数据指数型增长,对算力的需求与日俱增,另一…

    云计算 2023年4月13日
    00
  • Clusternet:一款开源的跨云多集群云原生管控利器!

    作者 徐迪,Clusternet 项目发起人,腾讯云容器技术专家。 摘要 Clusternet (Cluster Internet)是一个兼具多集群管理和跨集群应用编排的开源云原生管控平台,解决了跨云、跨地域、跨可用区的集群管理问题。 在项目规划阶段,就是面向未来混合云、分布式云和边缘计算等场景来设计的,支持海量集群的接入和管理、应用分发、流量治理(开发中)…

    云计算 2023年4月12日
    00
  • Javaweb 500 服务器内部错误的解决

    下面我就为大家详细讲解解决“Javaweb 500 服务器内部错误”的完整攻略,包含以下步骤: 1. 确认错误信息 首先我们需要明确出现了哪些具体的错误信息,这有助于我们更准确地定位和解决问题。可以查看服务器日志文件、控制台输出信息等。 2. 检查代码中的错误 接下来,我们可以检查一下代码中是否存在一些明显的问题,比如语法错误、空指针异常、数据库连接错误等等…

    云计算 2023年5月17日
    00
  • 云计算和数据 关于Windows Azure Table Storage 和 SQL Azure的选择

    这篇博客对在云计算解决方案中操作数据进行总览性的介绍。   概览 对于绝大多数解决方案而言,数据都是至关重要的一部分。在云计算里面,绝大多数现成的建议都可以直接拿来用。但是云计算也有其独特之处。这篇博客将讨论以下两个用例: 将你存放在云中的数据发布至全世界 在云端的项目中使用你本地的数据。   通用的建议 无论是哪种用例,这些建议都是通用的。   选择一个拓…

    2023年4月10日
    00
合作推广
合作推广
分享本页
返回顶部