找回密码
 会员注册
查看: 178|回复: 0

ASP.NET WebApi 实现Token验证

[复制链接]

250

主题

1

回帖

819

积分

管理员

积分
819
发表于 2024-2-29 08:20:39 | 显示全部楼层 |阅读模式

转自:https://www.cnblogs.com/dukang1991/p/5627584.html

基于令牌的认证

    我们知道WEB网站的身份验证一般通过session或者cookie完成的,登录成功后客户端发送的任何请求都带上cookie,服务端根据客户端发送来的cookie来识别用户。

    WEB API使用这样的方法不是很适合,于是就有了基于令牌的认证,使用令牌认证有几个好处:可扩展性、松散耦合、移动终端调用比较简单等等,别人都用上了,你还有理由不用吗?

    下面我们花个20分钟的时间来实现一个简单的WEB API token认证:

Step 1:安装所需的NuGet包:

打开NuGet包管理器控制台,然后输入如下指令:

  1. Install-Package Microsoft.AspNet.WebApi.Owin -Version 5.1.2
  2. Install-Package Microsoft.Owin.Host.SystemWeb -Version 2.1.0
  3. Install-Package Microsoft.AspNet.Identity.Owin -Version 2.0.1
  4. Install-Package Microsoft.Owin.Cors -Version 2.1.0
复制代码

Step 2 在项目根目录下添加Owin“Startup”类

  1. using System;
  2. using System.Web.Http;
  3. using Owin;
  4. using Microsoft.Owin;
  5. using Microsoft.Owin.Security.OAuth;
  6. using SqlSugar.WebApi;
  7. [assembly: OwinStartup(typeof(WebApi.Startup))]
  8. namespace WebApi
  9. {
  10. public class Startup
  11. {
  12. public void Configuration(IAppBuilder app)
  13. {
  14. HttpConfiguration config = new HttpConfiguration();
  15. ConfigureOAuth(app);
  16. WebApiConfig.Register(config);
  17. app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
  18. app.UseWebApi(config);
  19. }
  20. public void ConfigureOAuth(IAppBuilder app)
  21. {
  22. OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
  23. {
  24. AllowInsecureHttp = true,
  25. TokenEndpointPath = new PathString("/token"),
  26. AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
  27. Provider = new SimpleAuthorizationServerProvider()
  28. };
  29. app.UseOAuthAuthorizationServer(OAuthServerOptions);
  30. app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
  31. }
  32. }
  33. }
复制代码

Step 3:在项目根目录下添加验证类 SimpleAuthorizationServerProvider,为了简单用户的验证部分我们省略掉;

  1. using System.Threading.Tasks;
  2. using System.Security.Claims;
  3. using Microsoft.Owin.Security.OAuth;
  4. namespace WebApi
  5. {
  6. /// <summary>
  7. /// Token验证
  8. /// </summary>
  9. public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider
  10. {
  11. public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
  12. {
  13. await Task.Factory.StartNew(() => context.Validated());
  14. }
  15. public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
  16. {
  17. await Task.Factory.StartNew(() => context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" }));
  18. /*
  19. * 对用户名、密码进行数据校验
  20. using (AuthRepository _repo = new AuthRepository())
  21. {
  22. IdentityUser user = await _repo.FindUser(context.UserName, context.Password);
  23. if (user == null)
  24. {
  25. context.SetError("invalid_grant", "The user name or password is incorrect.");
  26. return;
  27. }
  28. }*/
  29. var identity = new ClaimsIdentity(context.Options.AuthenticationType);
  30. identity.AddClaim(new Claim("sub", context.UserName));
  31. identity.AddClaim(new Claim("role", "user"));
  32. identity.AddClaim(new Claim(ClaimTypes.Name, user.UserName));
  33. context.Validated(identity);
  34. }
  35. }
  36. }
复制代码

Step 4:让CORS起作用

在ASP.NET Web API中启用OAuth的Access Token验证非常简单,只需在相应的Controller或Action加上[Authorize]标记

  1. [Authorize]
  2. public ActionResult Index()
  3. {
  4. ViewBag.Title = "Home Page";
  5. return View();
  6. }
复制代码

Step 5 : 请求 Token

获取token, POST   http://localhost:23477/token

参数BODY x-www-form-urlencoded 格式:

grant_type=password&username=admin&password=123456

返回状态200 结果为

Step 5 调用api

只要在http请求头中加上Authorization:bearer Token就可以成功访问API就成功了:

GET   http://localhost:58192/api/testapi/testapi

Authorization : bearer 

T5jF97t5n-rBkWcwpiVDAlhzXtOvV7Jw2NnN1Aldc--xtDrvWtqLAN9hxJN3Fy7piIqNWeLMNm2IKVOqmmC0X5_s8MwQ6zufUDbvF4Bg5OHoHTKHX6NmZGNrU4mjpCuPLtSbT5bh_gFOZHoIXXIKmqD3Wu1MyyKKNhj9XPEIkd9bl4E9AZ1wAt4dyUxmPVA_VKuN7UvYJ97TkO04XyGqmXGtfVWKfM75mNVYNhySWTg

 

  结果为:

 


来源:https://blog.csdn.net/qq_32688731/article/details/80897563
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?会员注册

×
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-26 12:57 , Processed in 0.331490 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表