谈谈.NET CORE OAuth 2.0

什么是 OAuth 2.0?

OAuth 2.0 是一个委托协议,它可以让那些控制资源的人允许某个应用以代表他们来访问他们控制的资源,注意是代表这些人,而不是假冒或模仿这些人。这个应用从资源的所有者那里获得到授权(Authorization)access token(访问令牌),随后就可以使用这个 access token 来访问资源。

  • 假冒或模仿:客户端复制一份用户名和密码,从而获取相应权限
  • OAuth 2.0 是个委托协议:它不假冒用户,客户端应用无法获得用户名和密码(或其他凭证)

OAuth 2.0 特点:

  • 关于授权 Authorization

      仅做授权,无法做身份认证

  • Access Token
  • 支持多种客户端应用

OAuth 2.0 里面的三种角色

  • 资源所有者拥有访问 API 资源的权限,并且他还可以委派权限给其他应用来访问 API,资源所有者通常是可以使用浏览器的人
  • 受保护的资源就是资源所有者拥有权限去访问的组件,它可以是很多种形式的,最常见的还是 Web API
  • 客户端应用就是代表资源所有者访问被保护资源的一个软件,注意它既不是指浏览器,也不是指给你钱让你开发软件的人。在 OAuth 2.0 里面,它是指被保护的 API 资源的消费者

委托/委派权限

 

上面提到 OAuth 2.0 里面,最终用户可以委派他的一部分权限给客户端应用来代表最终用户访问被保护的资源。但要完成这件事,还需要一个桥梁来连接客户端应用和被保护资源,这个组件叫做授权服务器(Authorization Server, AS)

 

  • 授权服务器也许就是资源服务器,但是大多数情况下它们是不同的服务器
  • 授权服务器被受保护的资源信任
  • 授权服务器可以发布具有特定目的的 Access Token 给客户端应用

image.png

  1. 首先客户端需要获得权限,它可能有两种方式来获得权限:
  1. 从资源所有者那里直接获得权限(上图所示)也可以让授权服务器作为中介,从授权服务器那里间接的获得权限(下图所示)
  2. 如果使用授权服务器作为中介的话,客户端需要把资源所有者发送到授权服务器(可以理解为最终用户使用的浏览器被重定向到了授权服务器), 然后资源所有者在这可以对客户端应用进行授权
  3. 这时资源所有者要通过身份认证进入授权服务器,通常还会有一个是否同意授权客户端应用请求的选项,点击同意后就授权了。而从客户端应用的角度讲呢,它可以向资源所有者请求他一部分的功能和范围(Scope),在将来,资源所有者可能会逐渐减少它所拥有的功能和范围
  4. 至此,上面写的这个动作/东西叫做授权(Authorization Grant)
  5. 一旦执行了授权动作也就是客户端得到了授权(授权是一个可以代表资源所有者权限的凭据)。客户端便可以从授权服务器请求 Access Token 了。这个 Access Token 就可以被用来访问被保护的资源了

下图是使用授权服务器作为中介的流程图,除了授权,其它部分和上图表达的都是一个意思

image.png

授权 Authorization Grant

授权是一个代表着资源所有者权限的凭据,它可以被客户端应用来获取 Access Token。

 

OAuth 2.0 里面定义了 4 种类型的授权,分别是:

  1. Auhtorization Code 授权码
  2. Implicit
  3. Resource Owner Password Credentials
  4. Client Credentials

 

OAuth 2.0 还定义了一个扩展机制以便自定义其它的授权类型。

用一句话描述“授权(Authorization Grant)就是获取 Token 的方法”。

 

  • Authorization Code
  • 使用授权服务器作为客户端和资源所有者的中介在授权服务器把资源所有者送回(重定向)到客户端的时候带着这个临时的凭据 Authorization Code。它就代表着资源所有者委托给客户端应用的权限在安全方面的一些优点:
  • 可以对客户端应用进行身份认证Access Token 直接发送到客户端应用,不经过资源所有者的浏览器,所以不会将其暴露给外界,包括资源所有者
  • 适合 ASP.NET Core MVC 这类服务器端的客户端应用
  • Access Token 直接发送到 Web Server,不经过用户浏览器,不会暴露 Access Token
  • Implicit
  • Authorization Code 的简化版本
    • 针对浏览器内的客户端应用,例如 Angular SPA
    • 没有授权码发回给客户端应用的步骤,授权服务器直接把 Access Token 发回给了客户端应用,所以在浏览器内能获取到 Access Token
    • Implicit 授权确实可以提高浏览器内应用的响应性和效率,毕竟它减少了往返的次数。但是方便可能会带来风险,推荐尽量使用 Authorization Code
  • Resource Owner Password Credentials
  • 直接使用用户的密码作为授权来获得 Access Token
    • 仅当用户和客户端间高度信任且其他授权方式不可用时才可以使用这种授权方式
    • 这种凭据只应用于一次请求并用于交换 Access Token,避免客户端存储用户的凭据(密码)
  • 通过交换一个长期有效的 Access Token 或使用 Refresh Token都可以达到这种效果
  • Client Credentials
  • 受保护资源并不属于任意一个用户(没有用户对该资源负责),但客户端任需访问受保护资源
  • Device Code
  • Refresh Token
  • 通常能从授权服务器获得两个令牌:Access Token 和 Refresh Token
    • 当 Access Token 要过期时,我们使用 Refresh Token 再获取一个 Access Token

 

授权和认证

 

  • OAuth 2.0 授权 Authorization
  • 你能干什么
  • Openld Connect 身份认证 Authentication
  • 你是谁

 

文章主要参考于:https://www.cnblogs.com/cgzl/p/9221488.html

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现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。你可以根据自己的需求进行调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值