详解.NET实现OAuth2.0四种模式(1)

一、OAuth2.0的角色

在OAuth2.0协议中,有4个角色,分别是:

用户:访问受限制资源的用户。

应用:第三方应用,可能是手机App、Web应用或者桌面程序。

授权服务器:负责用户授权、颁发令牌、管理应用等。

资源服务器:存放受限制资源。

授权服务器和资源服务可以是同一个服务器。

举个例子,我们在“同城交友”这款应用中,需要微信登录并使用微信头像,那么,用户就是我们,应用是“同城交友”,授权服务器就是微信登录授权的服务器,而资源服务器存放了我们微信的头像。

二、一般流程

使用OAuth2.0协议,各角色一般的交互流程是这样的:

根据应用的特性,认证流程会有一些差异,具体来说会有4种模式。

三、四种模式

OAuth2.0的四种模式包括:授权码模式、密码模式、客户端模式和简化模式(授权码模式的简化,又称隐式授权码)。另外,通过RefreshToken获取令牌的方式也可以作为一种模式。

模式grant_type特点
授权码模式authorization_code功能最完整、流程最严密的授权模式,但较复杂
密码模式password使用用户名/密码作为授权方式从授权服务器上获取令牌,一般不支持刷新令牌。
客户端模式client_credentials无用户,用户向客户端注册,然后客户端以自己的名义获取资源
简化模式 令牌容易因为被拦截窃听而泄露,适用于公开的浏览器单页应用
RefreshTokenrefresh_token 

四、开发准备

在紧接着的章节中,会先介绍在.NET Framework框架中实现OAuth2.0的四种模式。这种实现方式并不支持.NET Core,面向.NET Core的开发在之后讲述。

开发环境:Visual Studio 2019

客户端测试工具:Postman

.NET版本:.NET Framework 4.6

项目模板:ASP.NET Web应用程序(.NET Framework)

在模板选项中,选择一个空的项目即可。

在开始编码前,我们可以先把NuGet程序包都添加好,没有特殊说明,四种模式的开发都是使用这些库。

NuGet程序包版本
Microsoft.AspNet.WebApi.Owin5.2.7
Microsoft.Owin.Host.SystemWeb4.1.0
Microsoft.Owin.Security.OAuth4.1.0
Microsoft.Owin.Cors4.1.0

一般情况下,上述程序包可以使用最新版本。如果出现问题,可使用表格中的版本,经测试没有问题。

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现OAuth2.0服务端,需要遵循OAuth2.0协议,实现授权服务器和资源服务器之间的交互。以下是基本的步骤: 1.创建一个ASP.NET Core Web API项目。 2.安装IdentityServer4和Microsoft.AspNetCore.Authentication.JwtBearer NuGet包。 3.在Startup.cs中配置IdentityServer,并添加JwtBearer认证。 4.创建客户端和API资源,并将它们添加到IdentityServer中。 5.实现OAuth2.0授权终结点,例如授权码授权、密码授权、客户端凭证授权等。 6.实现API资源的保护,验证JWT令牌并确保访问令牌有效。 7.测试OAuth2.0授权和保护API资源。 下面是一个简单的示例,演示如何实现OAuth2.0服务端,包括JWT: 1. 在Startup.cs中配置IdentityServer和JwtBearer认证。示例代码如下: ```csharp public void ConfigureServices(IServiceCollection services) { //添加IdentityServer服务 services.AddIdentityServer() .AddInMemoryClients(Config.Clients) .AddInMemoryApiResources(Config.Apis) .AddDeveloperSigningCredential(); //添加JwtBearer认证 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Authority = "http://localhost:5000"; //IdentityServer地址 options.RequireHttpsMetadata = false; //HTTPS设置为false,方便测试 options.Audience = "api1"; //API资源名称 }); services.AddControllers(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseRouting(); app.UseIdentityServer(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } ``` 2. 创建客户端和API资源。示例代码如下: ```csharp public static class Config { public static IEnumerable<Client> Clients => new List<Client> { new Client { ClientId = "client1", ClientSecrets = { new Secret("secret1".Sha256()) }, AllowedGrantTypes = GrantTypes.ClientCredentials, AllowedScopes = { "api1" } } }; public static IEnumerable<ApiResource> Apis => new List<ApiResource> { new ApiResource("api1", "My API") }; } ``` 3. 实现授权终结点。示例代码如下: ```csharp [HttpPost] [Route("/connect/token")] public async Task<IActionResult> Token([FromBody] TokenRequest request) { if (request.GrantType == "password") { var user = _userService.ValidateCredentials(request.UserName, request.Password); if (user != null) { var accessToken = await _tokenService.CreateAccessTokenAsync(user); return Ok(new { access_token = accessToken, token_type = "Bearer", expires_in = (int)_tokenService.Options.Expiration.TotalSeconds }); } } return BadRequest(new { error = "unsupported_grant_type" }); } ``` 4. 实现API资源的保护。示例代码如下: ```csharp [Authorize] [HttpGet] [Route("test")] public IActionResult Test() { return Ok(new { message = "Hello, World!" }); } ``` 以上是一个基本的OAuth2.0服务端实现,包括JWT。你可以根据自己的需求进行调整和扩展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值