ASP.NET Core Web API用户身份验证

这篇具有很好参考价值的文章主要介绍了ASP.NET Core Web API用户身份验证。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、JWT介绍

ASP.NET Core Web API用户身份验证的方法有很多,本文只介绍JWT方法。JWT实现了服务端无状态,在分布式服务、会话一致性、单点登录等方面凸显优势,不占用服务端资源。简单来说,JWT的验证过程如下所示:

(1)通过用户名和密码获取一个Token。

(2)访问API时,加上这个Token。

Token包含过期时间、用户角色等信息,可以在多种场合灵活使用。

二、基本认证

2.1 场景描述

在基本认证的场景中,我们假设有一个Controller,代码如下所示:

[ApiController]
[Route("test")]
public class TestController : ControllerBase
{
    [HttpGet]
    public string Get()
    {
        return "success";
    }
}

这个Controller非常简单,就是访问之后返回"success"这个字符串。

现在,我们希望用户登录之后(提供用户名和密码)才能使用此API。

2.2 开发步骤

1、在NuGet中添加Microsoft.AspNetCore.Authentication.JwtBearer。

2、在Program.cs中,对builder.Services添加认证服务:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(opt =>
    {
        opt.TokenValidationParameters = new TokenValidationParameters()
        {
            ValidateIssuer = false,
            ValidateAudience = false,
            ValidateLifetime = false,
            ValidateIssuerSigningKey = false
        };
    });

在上面的参数中,可以根据使用场景进行灵活配置,这个后面会介绍。在此,使用最简单的配置。

3、同样在Program.cs中,添加以下语句:

app.UseAuthentication();

需要注意的是,此句需要在页面路由之前,例如是app.UseHttpsRedirection();之前,如下所示:

app.UseAuthentication();

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

4、在需要认证的Controller或某个具体方法上加上[Authorize]标记。例如我们在一开始介绍的API上加上标记:

[Authorize]
[HttpGet]
public string Get()
{
    return "success";
}

此时,如果再去访问此API,就会返回401没有权限的错误。

5、创建登录的Controller,也就是通过用户名和密码获取Token。

[Route("api/auth")]
[ApiController]
public class AuthController : ControllerBase
{
    [HttpPost]
    public string Gettoken(string username, string password)
    {
        if (username == "admin" && password == "123456")
        {
            var claims = new[]{
                new Claim(ClaimTypes.Name, username)
            };
            var jwttoken = new JwtSecurityToken(
                claims: claims
            );
            var token = new JwtSecurityTokenHandler().WriteToken(jwttoken);
            return token;
        }
        return "用户不存在或密码错误";
    }
}

上面的用户认证简单的做了字符串比对,实际上可以通过查数据库的方法验证用户是否合法。

至此,用户验证的后端就开发完成了。

三、前端访问API

3.1 通过Swagger测试

很多时候,我们使用Swagger来测试API,但默认的Swagger配置没有用户验证,需要进行添加。

打开Program.cs,把builder.Services.AddSwaggerGen();这一句修改为:

builder.Services.AddSwaggerGen(c =>
{
    c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()
    {
        In = ParameterLocation.Header,
        Type = SecuritySchemeType.ApiKey,
        Description = "Bearer Token",
        Name = "Authorization",
        BearerFormat = "JWT",
        Scheme = "Bearer"
    });
    c.AddSecurityRequirement(new OpenApiSecurityRequirement() {
        {
            new OpenApiSecurityScheme()
            {
                Reference=new OpenApiReference()
                {
                    Type=ReferenceType.SecurityScheme,
                    Id="Bearer"
                }
            },new string[]{ }
        }
    });
});

此时,打开Swagger,就会看到右上角有一个Authorize的按钮,如下图所示:

webapi认证方式,ASP.NET,asp.net,用户验证,webapi,jwt

点击按钮,会要求输入一个Token。我们从上面写的登录Controller(AuthController)获取。如下图所示:

webapi认证方式,ASP.NET,asp.net,用户验证,webapi,jwt

 最下面的响应字符串就是我们要的Token。把这个Token填入到上面弹出的对话框中,注意需要在字符串前加上“Bearer ”。如下图所示:

webapi认证方式,ASP.NET,asp.net,用户验证,webapi,jwt

此时,再去访问TestController,就会返回成功结果。

3.2 前端访问方法

 在无用户验证要求的时候,前端访问TestController的代码如下所示:

fetch("https://localhost:28911/test", {
    method: "GET"
}).then(resp => {
    return resp.text();
}).then(data => {
    console.log(data);
}).catch(err => {
    console.log(err)
});

API前加上[Authorize]之后,上述调用也会返回401错误。上述调用需要把Token加入到Header中。

fetch("https://localhost:28911/test", {
    method: "GET",
    headers: {
        "Authorization": "Bearer eyJhbGciOiJ...太长,Token后面省略"
    }
}).then(resp => {
    return resp.text();
}).then(data => {
    console.log(data);
}).catch(err => {
    console.log(err)
});

此时,即可再次成功获取结果。

四、常见用户身份验证场景

4.1 Token有效期

一般情况下,通过用户名和密码得到了Token之后,我们不希望这个Token是永久有效的。也就是说,过了一段时间之后,Token失效,用户需要重新登录。

需要增加有效期,有几处地方需要修改。

首先是Program.cs中,原来的配置如下所示:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(opt =>
    {
        opt.TokenValidationParameters = new TokenValidationParameters()
        {
            ValidateIssuer = false,
            ValidateAudience = false,
            ValidateLifetime = false,
            ValidateIssuerSigningKey = false
        };
    });

需要把ValidateLifetime改为true:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(opt =>
    {
        opt.TokenValidationParameters = new TokenValidationParameters()
        {
            ValidateIssuer = false,
            ValidateAudience = false,
            ValidateLifetime = true,
            ClockSkew = TimeSpan.FromSeconds(30),
        };
    });

然后在AuthController的Gettoken方法里,加上有效期:

var claims = new[]{
    new Claim(JwtRegisteredClaimNames.Nbf,new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds().ToString()) ,
    new Claim(JwtRegisteredClaimNames.Exp,new DateTimeOffset(DateTime.Now.AddMinutes(30)).ToUnixTimeSeconds().ToString()),
    new Claim(ClaimTypes.Name, username)
};

上面配置的有效期是30分钟。

至此,当获得一个新的Token之后,经过30分钟,这个Token就无法使用了。

4.2 第三方验证

很多网站上提供QQ登录、微信登录、微博登录等功能,我们以微信登录进行说明。如果我们需要使用微信登录,需要到微信开发者平台注册,拿到一个叫AppKey的东西。这个AppKey相当于一个私钥,是不能让别人看到的。因为我们要使用微信的登录验证服务,这个服务不能向任何人提供,而且需要区分是哪个第三方在使用服务。

为了实现上述功能,认证时加入了一个IssUser的概念,也就是哪些APP可以调用服务。

在Program.cs中,修改配置:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(opt =>
    {
        opt.TokenValidationParameters = new TokenValidationParameters()
        {
            ValidateIssuer = true,
            ValidateAudience = false,
            ValidateLifetime = false,
            ValidateIssuerSigningKey = true,
            ValidIssuer = "App名称",
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("App私钥"))
        };
    });

然后,在Gettoken时,进行修改:

var claims = new[]{
    new Claim(ClaimTypes.Name, username)
};
var m5dkey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("App私钥"));
var creds = new SigningCredentials(m5dkey, SecurityAlgorithms.HmacSha256);
var jwttoken = new JwtSecurityToken(
    issuer: "App名称",
    claims: claims,
    expires: DateTime.Now.AddMinutes(30),
    signingCredentials: creds
);
var token = new JwtSecurityTokenHandler().WriteToken(jwttoken);
return token;

4.3 角色或权限

很多时候,用户登录之后,并不是可以访问所有的API。用户可以分出不同的角色,不同的角色可以访问不同的资源。

要做到这一点,首先在Gettoken时,把用户的角色加入到Token中。

var claims = new[]{
    new Claim(ClaimTypes.Name, username),
    new Claim("Role", "admin")
};

然后,在API前,指明此资源需要什么角色。

[Authorize(Roles = "admin")]
[HttpGet]
public string Get()
{
    return "success";
}

这样,按角色分配资源的功能就完成了。文章来源地址https://www.toymoban.com/news/detail-676805.html

到了这里,关于ASP.NET Core Web API用户身份验证的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ASP.NET Core Web API下基于Keycloak的多租户用户授权的实现

    在上文《Keycloak中授权的实现》中,以一个实际案例介绍了Keycloak中用户授权的设置方法。现在回顾一下这个案例: 服务供应商(Service Provider)发布/WeatherForecast API供外部访问 在企业应用(Client)里有三个用户:super,daxnet,nobody 在企业应用里有两个用户组:administrators,u

    2024年04月22日
    浏览(32)
  • ASP.NET Core 8.0 WebApi 从零开始学习JWT登录认证

    我一起写后端Api我都是直接裸连的,但是现在为了规范一些,我还是打算上一个JWT功能 ASP.NET Web API 2系列(四):基于JWT的token身份认证方案 Jwt-dotnet github 选好了模板,就进去看看号了,42M的下载量已经很高了,一般来说,只要超过500k的下载量,基本就是一个稳定的代码仓库了

    2024年04月09日
    浏览(35)
  • Asp.Net Core 6 Cookie 的身份验证策略

    参考文献: http://www.js-code.com/xindejiqiao/xindejiqiao_274882.html https://www.cnblogs.com/xiaoxiaotank/p/15811749.html 编写代码过程中不理解的代码可参考上面的文献 首先需要配置你的Program.cs,代码如下: 然后开启中间件  创建一个AuthenticationMiddleware.cs类 在写登录的地方去使用  最后给你的控制

    2024年02月16日
    浏览(28)
  • 在ASP.NET Core中轻松使用JwtBeare进行身份验证

    JwtBearer简介 首先要搞清楚什么是JwtBearer,JwtBearer是ASP.NET Core的OAuth 2.0 JWT Bearer身份验证提供程序。它提供了对JWT令牌进行验证的功能,然后允许将令牌中包含的声明(claims)用于用户身份验证和授权控制。 Json Web Token (JWT)是一种Web标准,用于在不同系统间传输数据。JWT是一种

    2024年02月04日
    浏览(34)
  • ASP.NET Core 中的两种 Web API

    ASP.NET Core 有两种创建 RESTful Web API 的方式: 基于 Controller,使用完整的基于ControllerBase的基类定义接口endpoints。 基于 Minimal APIs,使用Lambda表达式定义接口 endpoints。 基于 Controller 的 Web API 可以使用构造函数注入,或者属性注入,遵循面向对象模式。 基于 Minimal APIs 的 Web API 通

    2024年02月09日
    浏览(31)
  • ASP.NET Core Web API 流式返回,逐字显示

    Websocket、SSE(Server-Sent Events)和长轮询(Long Polling)都是用于网页和服务端通信的技术。 Websocket是一种全双工通信协议,能够实现客户端和服务端之间的实时通信。它基于TCP协议,并且允许服务器主动向客户端推送数据,同时也允许客户端向服务器发送数据。 SSE是一种单向

    2023年04月23日
    浏览(38)
  • ASP.NET Core Web API入门之三:使用EF Core

    一般来讲我们做项目都会用实体类跟数据库实体进行关系对应,这样的好处方便我们维护、增删改查,并且可以减少SQL的编写,从而统一风格,那么 Entity Framework Core 就是很不错的ORM框架。 1、跨数据库支持能力强大,只需修改配置就可以轻松实现数据库切换。 2、提升了开发效

    2024年02月10日
    浏览(39)
  • 2.1 .net 8 ASP.NET Core Web API - Controller详解

    书接上回,上节我们留了几个问题,即: 1、接口Hello的名字究竟怎么来的? 2、我们如果想把接口改成其他的名称,应该怎么做? 3、我们继承ControllerBase,以及[Route(“[controller]”)]属性,又是分别起到什么作用? 需要解决以上几个问题,我们就要继续深入研究Controller相关的

    2024年02月20日
    浏览(33)
  • ASP.NET Core 中基于 Controller 的 Web API

    客户端发送Http请求,Contoller响应请求,并从数据库读取数据,序列化数据,然后通过 Http Response返回序列化的数据。 Web API 的所有controllers 一般继承于 ControllerBase 类,而不是Controller 类。 因为 Controller 类也继承自ControllerBase 类,但是支持views,而API一般不需要这个功能。 Co

    2024年02月10日
    浏览(48)
  • 在 ASP.NET Core Web API 中处理 Patch 请求

    PUT 和 PATCH 方法用于更新现有资源。 它们之间的区别是,PUT 会替换整个资源,而 PATCH 仅指定更改。 在 ASP.NET Core Web API 中,由于 C# 是一种静态语言( dynamic 在此不表),当我们定义了一个类型用于接收 HTTP Patch 请求参数的时候,在 Action 中无法直接从实例中得知客户端提供了哪

    2024年02月04日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包