OpenIddict 介绍

一.什么是OpenIddict 

  OpenIddict 是一个开源的通用框架 ,用于在任何 ASP.NET Core 2.1(及更高版本)和遗留 ASP.NET 4.6.1(及更高版本)应用程序中构建符合标准的 OAuth 2.0/OpenID Connect 服务器。

  OpenIddict  授权服务器中集成包括: 直通模式和事件模型。OpenIddict允许自定义控制器的Action和自定义中间件,来处理授权、注销、令牌请求。

  与OpenIddict  的集成通常是通过直通模式来处理控制器操作或最小API处理程序中的请求,对于更复杂的场景直接使用其高级事件模型来完成。

  OpenIddict 为 授权服务器实现了一个强大的基于事件的模型:请求处理逻辑的每个部分都被实现为一个事件处理程序,可以将其删除、移动到管道中的不同位置或由自定义处理程序替换以覆盖OpenIddict使用的默认逻辑。 

二.应用权限

  OpenIddict  内置了“应用程序权限”的功能,允许控制和限制每个注册的客户端应用程序能够使用OAuth 2.0/OpenID Connect功能,目前支持4类权限:

  1)Endpoint permissions(端点权限)

  2)Grant type permissions(授予类型权限)

  3)Scope permissions(范围权限)

  4)Response type permissions(响应类型权限)

  这四种权限概念,其实在keycloak或ids4中都有体现。

  2.1 端点权限

    是指限制客户端应用程序可以使用的端点。

    权限端点包括:

端点枚举类型
Authorization(授权)OpenIddictConstants.Permissions.Endpoints.Authorization
Introspection(内省)OpenIddictConstants.Permissions.Endpoints.Introspection
Logout/end session(注销/结束会话)OpenIddictConstants.Permissions.Endpoints.Logout
Revocation(撤消)OpenIddictConstants.Permissions.Endpoints.Revocation
Token(令牌)OpenIddictConstants.Permissions.Endpoints.Token

    在以下示例中,mvc允许应用程序使用授权、注销和令牌端点,但在尝试发送内省或撤销请求时会出错:

    下面是手动用代码创建一个mvc的客户端,分配权限,在生产中需要实现动态配置客户端。  

if (await manager.FindByClientIdAsync("mvc") is null)
{
    await manager.CreateAsync(new OpenIddictApplicationDescriptor
    {
        ClientId = "mvc",
        ClientSecret = "901564A5-E7FE-42CB-B10D-61EF6A8F3654",
        DisplayName = "MVC client application",
        PostLogoutRedirectUris = { new Uri("http://localhost:53507/signout-callback-oidc") },
        RedirectUris = { new Uri("http://localhost:53507/signin-oidc") },
        Permissions =
        {
            OpenIddictConstants.Permissions.Endpoints.Authorization,
            OpenIddictConstants.Permissions.Endpoints.Logout,
            OpenIddictConstants.Permissions.Endpoints.Token
        }
    });
}

    禁用端点权限,如果不想使用端点权限,请调用options.IgnoreEndpointPermissions()以忽略它们:

services.AddOpenIddict()
    .AddServer(options =>
    {
        options.IgnoreEndpointPermissions();
    });

  2.2 授予类型权限

    是指:限制允许客户端应用程序使用的授予类型,也就是授权许可类型。

Grant Type枚举类型
Authorization code(授权码类型)OpenIddictConstants.Permissions.GrantTypes.AuthorizationCode
Client credentials(客户端凭据类型)OpenIddictConstants.Permissions.GrantTypes.ClientCredentials
Implicit (隐式类型)OpenIddictConstants.Permissions.GrantTypes.Implicit
Password(资源拥有者类型 )OpenIddictConstants.Permissions.GrantTypes.Password
Refresh token(刷新token)OpenIddictConstants.Permissions.GrantTypes.RefreshToken

    例如下面示例中,postman客户端只能使用Authorization code许可类型,console客户端使用password和refresh_token许可类型。下面也是通过手动用代码创建客户端。    

if (await manager.FindByClientIdAsync("postman") is null)
{
    await manager.CreateAsync(new OpenIddictApplicationDescriptor
    {
        ClientId = "postman",
        DisplayName = "Postman",
        RedirectUris = { new Uri("https://www.getpostman.com/oauth2/callback") },
        Permissions =
        {
            OpenIddictConstants.Permissions.Endpoints.Authorization,
            OpenIddictConstants.Permissions.Endpoints.Token,

            OpenIddictConstants.Permissions.GrantTypes.AuthorizationCode
        }
    });
}

if (await manager.FindByClientIdAsync("console") is null)
{
    await manager.CreateAsync(new OpenIddictApplicationDescriptor
    {
        ClientId = "console",
        DisplayName = "Console",
        Permissions =
        {
            OpenIddictConstants.Permissions.Endpoints.Token,

            OpenIddictConstants.Permissions.GrantTypes.Password,
            OpenIddictConstants.Permissions.GrantTypes.RefreshToken
        }
    });
}

    如果不想使用授予类型的权限,请调用options.IgnoreGrantTypePermissions()以忽略它们:

services.AddOpenIddict()
    .AddServer(options =>
    {
        options.IgnoreGrantTypePermissions();
    });

   2.3 范围权限

    是指:允许客户端应用程序使用的范围(标准或自定义),注意openid 和offline_acces 范围不需要明确的权限。

    以下示例中,angular客户端允许请求addressprofilemarketing_api范围:任何其他范围都将导致返回错误。

if (await manager.FindByClientIdAsync("angular") is null)
{
    await manager.CreateAsync(new OpenIddictApplicationDescriptor
    {
        ClientId = "angular",
        DisplayName = "Angular",
        RedirectUris = { new Uri("https://localhost:34422/callback") },
        Permissions =
        {
            OpenIddictConstants.Permissions.Endpoints.Authorization,
            OpenIddictConstants.Permissions.GrantTypes.Implicit,

            OpenIddictConstants.Permissions.Scopes.Address,
            OpenIddictConstants.Permissions.Scopes.Profile,
            OpenIddictConstants.Permissions.Prefixes.Scope + "marketing_api"
        }
    });
}

    如果不想使用范围权限,请调用options.IgnoreScopePermissions()以忽略它们:

services.AddOpenIddict()
    .AddServer(options =>
    {
        options.IgnoreScopePermissions();
    });

  2.4 响应类型权限

    是指:限制客户端应用程序在实现交互式流(如代码、隐式或混合)时允许使用的响应类型。  

响应类型枚举类型
codeOpenIddictConstants.Permissions.ResponseTypes.Code
code id_tokenOpenIddictConstants.Permissions.ResponseTypes.CodeIdToken
code id_token tokenOpenIddictConstants.Permissions.ResponseTypes.CodeIdTokenToken
code tokenOpenIddictConstants.Permissions.ResponseTypes.CodeToken
id_tokenOpenIddictConstants.Permissions.ResponseTypes.IdToken
id_token tokenOpenIddictConstants.Permissions.ResponseTypes.IdTokenToken
noneOpenIddictConstants.Permissions.ResponseTypes.None
tokenOpenIddictConstants.Permissions.ResponseTypes.Token

    下面示例中,postman客户端只使用code id_token响应类型

if (await manager.FindByClientIdAsync("postman") is null)
{
    await manager.CreateAsync(new OpenIddictApplicationDescriptor
    {
        ClientId = "postman",
        DisplayName = "Postman",
        RedirectUris = { new Uri("https://www.getpostman.com/oauth2/callback") },
        Permissions =
        {
            OpenIddictConstants.Permissions.Endpoints.Authorization,
            OpenIddictConstants.Permissions.Endpoints.Token,

            OpenIddictConstants.Permissions.GrantTypes.AuthorizationCode,

            OpenIddictConstants.Permissions.ResponseTypes.CodeIdToken
        }
    });
}

    如果不想使用响应类型权限,请调用options.IgnoreResponseTypePermissions()以忽略它们:

services.AddOpenIddict()
    .AddServer(options =>
    {
        options.IgnoreResponseTypePermissions();
    });
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值