当前位置: 首页 > news >正文

C# OAuth2密码模式接口鉴权

项目场景:

asp.netFramework webApi
C# OAuth2密码模式接口鉴权


1.安装必要 NuGet 包

Install-Package Microsoft.Owin.Security.OAuth
Install-Package Microsoft.Owin.Host.SystemWeb
Install-Package Microsoft.AspNet.WebApi.Owin

2. 配置 OAuth 授权服务器

public class CustomOAuthProvider : OAuthAuthorizationServerProvider
{// 验证客户端(可在此处校验 client_id/client_secret)public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context){context.Validated();return Task.CompletedTask;}// 密码模式核心:验证用户名密码public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context){// 1. 验证用户凭证(实际项目中替换为数据库验证)if (!ValidateUser(context.UserName, context.Password)){context.SetError("invalid_grant", "用户名或密码错误");return;}// 2. 创建身份声明var identity = new ClaimsIdentity(context.Options.AuthenticationType);identity.AddClaim(new Claim(ClaimTypes.Name, context.UserName));identity.AddClaim(new Claim(ClaimTypes.Role, "User")); // 添加角色// 3. 创建附加数据(可选)var props = new AuthenticationProperties(new Dictionary<string, string>{{ "client_id", context.ClientId ?? string.Empty }});// 4. 生成令牌var ticket = new AuthenticationTicket(identity, props);context.Validated(ticket);}private bool ValidateUser(string username, string password){// 实际项目:此处查询数据库验证用户return username == "admin" && password == "123456"; // 示例硬编码}
}

3. 配置 OWIN Startup 类 (Startup.cs)

[assembly: OwinStartup(typeof(YourNamespace.Startup))]
namespace YourNamespace
{public class Startup{public void Configuration(IAppBuilder app){// 配置 WebAPIvar config = new HttpConfiguration();WebApiConfig.Register(config);// 配置 OAuth 服务器ConfigureOAuth(app);// 启用 WebAPIapp.UseWebApi(config);}public void ConfigureOAuth(IAppBuilder app){var oAuthOptions = new OAuthAuthorizationServerOptions{AllowInsecureHttp = true, // 开发环境允许 HTTPTokenEndpointPath = new PathString("/token"), // 令牌端点地址AccessTokenExpireTimeSpan = TimeSpan.FromHours(1), // 令牌有效期Provider = new CustomOAuthProvider() // 使用自定义提供程序};// 启用授权服务器app.UseOAuthAuthorizationServer(oAuthOptions);// 启用 Bearer Token 认证app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());}}
}

4. 保护 API 控制器

[Authorize] // 要求认证
[RoutePrefix("api/protected")]
public class ProtectedController : ApiController
{[HttpGet][Route("data")]public IHttpActionResult GetSecureData(){var userName = User.Identity.Name; // 获取当前用户return Ok($"安全数据,用户: {userName}");}
}

相关文章:

  • vue防止按钮重复点击方案
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | FAQ Collapse(问题解答折叠面板)
  • 如何使用vue2设计提示框组件
  • python-docx 库教程
  • Linux内核学习资料-deepseek
  • OPenCV CUDA模块图形变换----构建透视变换映射表函数buildWarpPerspectiveMaps()
  • 【技术支持】Android11 中获取应用列表
  • AVCap视频处理成帧和音频脚本
  • React前端框架学习
  • Babylon.js引擎(二)
  • 【python】基于pycharm的海康相机SDK二次开发
  • 美团NoCode设计网站的尝试经验分享
  • 打卡第42天:简单CNN
  • 游戏日志统计操作次数前三的用户
  • Linux日志分割压缩实战指南
  • 手写RPC框架<四> 负载均衡
  • 不同厂商保障UEFI/BIOS安全的技术与机制详解
  • 界面控件DevExpress WPF v24.2新版亮点:报表等组件功能升级
  • thinkphp 一个系统在同一个域名下,一个文件夹下如何区分多站点——穷人的精致规划——仙盟创梦IDE
  • MyBatis实战指南(六)自动映射
  • 网络宣传广告费多少/seo是什么seo怎么做
  • 最新网游排行榜2024/网站seo怎么操作
  • 网站开发体会范文/汕头seo建站
  • 网站如何做a b测试/seo网络优化是什么意思
  • 张店党风廉政建设网站/无锡百度关键词优化
  • h5网页设计欣赏/搜索引擎推广与优化