当前位置:首页 » 《资源分享》 » 正文

.Net WebApi 中的Token/参数校验:你真的会了吗?

7 人参与  2024年10月29日 08:01  分类 : 《资源分享》  评论

点击全文阅读


?关注墨瑾轩,带你探索编程的奥秘!?
?超萌技术攻略,轻松晋级编程高手?
?技术宝库已备好,就等你来挖掘?
?订阅墨瑾轩,智趣学习不孤单?
?即刻启航,编程之旅更有趣?

在这里插入图片描述在这里插入图片描述

.Net WebApi 中的Token/参数校验:你真的会了吗?


引言

在现代Web应用开发中,安全性和可靠性是至关重要的。当我们谈论WebAPI时,一个常见的需求是对请求进行身份验证,特别是通过Token来验证用户的身份。同时,确保传入的参数是有效和安全的也是至关重要的。这篇文章将深入探讨在.Net WebApi中实现Token和参数校验的几种方法,并提供详细的代码示例,帮助你更好地理解并实施这些技术。

正文
为什么需要校验Token/参数?

在WebAPI中,每一个请求都应该被视为潜在的安全威胁。通过校验Token,我们可以确认请求的来源是可信的,并且请求者的身份已被验证。同样,校验参数可以防止恶意的数据注入,保证系统的稳定性和安全性。

如何在校验Token?

在.Net WebApi中,有多种方法可以用来校验Token。我们将通过几个具体的例子来探索这些方法。

1. 使用OAuth2和JWT

OAuth2是一种授权协议,而JWT(JSON Web Tokens)是一种紧凑的、安全的方式来在各方之间传输信息作为JSON对象。在WebApi中,可以通过以下步骤来实现基于JWT的Token校验:

// 添加必要的NuGet包// Install-Package Microsoft.AspNet.WebApi.Owin.Security.Jwt// Install-Package Microsoft.Owin.Security.Jwtusing Owin;using Microsoft.Owin;using Microsoft.Owin.Security.OAuth;using System.Web.Http;public static class WebApiConfig {    public static void Register(HttpConfiguration config) {        var oAuthServerOptions = new OAuthAuthorizationServerOptions {            AllowInsecureClient = true,            TokenEndpointPath = new PathString("/token"),            AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),            Provider = new SimpleProvider()        };        app.UseOAuthBearerTokens(oAuthServerOptions);        // 其他WebApi配置...    }    public class SimpleProvider : OAuthAuthorizationServerProvider {        public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) {            context.Validated();        }        public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) {            context.OwinContext.Response.Body = new StringContent(                $"access_token={context.CreateAccessToken().ToString()}&token_type=bearer");            context.RequestCompleted();        }    }}

代码解析

使用 OwinOAuthAuthorizationServerOptions 来配置OAuth服务。SimpleProvider 类继承自 OAuthAuthorizationServerProvider 并重写了 ValidateClientAuthenticationGrantResourceOwnerCredentials 方法,用于验证客户端身份和发放访问令牌。
2. 自定义过滤器

除了使用OAuth外,我们还可以创建自定义的过滤器来校验Token。这种方法更灵活,可以根据特定需求进行调整。

using System.Net.Http;using System.Threading.Tasks;using System.Web.Http.Filters;public class TokenValidationFilter : AuthorizationFilterAttribute {    public override void OnAuthorization(AuthorizationContext filterContext) {        var token = filterContext.RequestContext.HttpContext.Request.Headers["Authorization"];        if (string.IsNullOrEmpty(token)) {            throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.Unauthorized));        }                // 进行Token有效性检查        if (!IsValidToken(token)) {            throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.Forbidden));        }    }    private bool IsValidToken(string token) {        // 这里应实现Token校验逻辑        return true; // 示例中假定Token总是有效的    }}public class ValuesController : ApiController {    [HttpGet]    [TokenValidationFilter]    public IHttpActionResult Get() {        return Ok(new { message = "Access granted." });    }}

代码解析

定义了一个名为 TokenValidationFilter 的自定义过滤器。在 OnAuthorization 方法中检查请求头中的 Authorization 字段。如果Token无效,则返回HTTP 403 Forbidden。如果Token不存在,则返回HTTP 401 Unauthorized。
如何校验参数?

校验参数通常是确保API安全的第一步。下面是一些常用的校验方法:

1. 使用DataAnnotations

.NET Framework 提供了 DataAnnotations 来帮助校验模型。

public class UserRequest {    [Required(ErrorMessage = "The Name field is required.")]    [StringLength(100, ErrorMessage = "The Name must be at least 6 characters long.", MinimumLength = 6)]    public string Name { get; set; }    [RegularExpression(@"^[\w\.-]+@[\w\.-]+\.\w+$", ErrorMessage = "Invalid email format.")]    public string Email { get; set; }}public class AccountController : ApiController {    [HttpPost]    public HttpResponseMessage Post([FromBody]UserRequest user) {        if (!ModelState.IsValid) {            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);        }                // 处理逻辑...        return Request.CreateResponse(HttpStatusCode.Created);    }}

代码解析

使用 [Required][StringLength][RegularExpression] 属性来校验 UserRequest 中的属性。如果 ModelState 不是有效的,则返回HTTP 400 Bad Request。
2. 自定义校验逻辑

对于更复杂的校验逻辑,可以编写自定义的校验方法。

public class AccountController : ApiController {    [HttpPost]    public HttpResponseMessage Post([FromBody]UserRequest user) {        if (user.Name.Length < 6 || !IsValidEmail(user.Email)) {            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Invalid data.");        }        // 处理逻辑...        return Request.CreateResponse(HttpStatusCode.Created);    }    private bool IsValidEmail(string email) {        try {            var addr = new System.Net.Mail.MailAddress(email);            return addr.Address == email;        } catch {            return false;        }    }}

代码解析

自定义了 IsValidEmail 方法来校验邮箱地址的有效性。如果名称长度小于6或者邮箱地址无效,则返回HTTP 400 Bad Request。
结论

通过本文的介绍,你应该对在.Net WebApi中实现Token和参数校验有了更深的理解。无论是使用OAuth和JWT来校验Token,还是通过自定义过滤器和DataAnnotations来校验参数,都能有效地提高WebAPI的安全性。希望这些技巧能够帮助你在实际项目中更好地保护你的API。记住,安全总是在变化,不断学习最新的安全实践是非常重要的!


点击全文阅读


本文链接:http://zhangshiyu.com/post/179298.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1