项目
版本

OpenIddict 应用权限

OpenIddict 集成了一个名为“应用权限”的内置功能,该功能能够控制并限制每个注册的客户端应用能够使用的 OAuth 2.0/OpenID Connect 特性。 目前支持四类权限:

  • 终端点权限
  • 授予类型权限
  • 作用域权限
  • 响应类型权限(在 OpenIddict 3.0 中引入)

终端点权限

定义

终端点权限限制了客户端应用可以使用的端点。

支持的权限

终端点 常量
授权 OpenIddictConstants.Permissions.Endpoints.Authorization
自省 OpenIddictConstants.Permissions.Endpoints.Introspection
注销/结束会话 OpenIddictConstants.Permissions.Endpoints.Logout
撤销 OpenIddictConstants.Permissions.Endpoints.Revocation
令牌 OpenIddictConstants.Permissions.Endpoints.Token

示例

在以下示例中,mvc应用被允许使用授权、注销和令牌端点,但如果尝试发送 introspection 或撤销请求,将会收到错误:

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();
    });

授予类型权限

定义

授予类型权限限制了客户端应用被允许使用的授权类型。

支持的权限

授予类型 常量
授权码 OpenIddictConstants.Permissions.GrantTypes.AuthorizationCode
客户端凭据 OpenIddictConstants.Permissions.GrantTypes.ClientCredentials
隐式 OpenIddictConstants.Permissions.GrantTypes.Implicit
密码 OpenIddictConstants.Permissions.GrantTypes.Password
刷新令牌 OpenIddictConstants.Permissions.GrantTypes.RefreshToken

要添加自定义的授予类型权限,可以使用以下模式:

OpenIddictConstants.Permissions.Prefixes.GrantType + "custom_flow_name"

示例

在以下示例中,postman 应用只能使用授权码授权类型,而 console 应用则被限制使用 passwordrefresh_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();
    });

作用域权限

定义

作用域权限限制了客户端应用被允许使用的作用域(标准或自定义)。

openidoffline_access作用域由 OpenIddict 特殊处理,不需要显式权限。

支持的权限

作用域 常量
地址 OpenIddictConstants.Permissions.Scopes.Address
电子邮件 OpenIddictConstants.Permissions.Scopes.Email
电话 OpenIddictConstants.Permissions.Scopes.Phone
个人资料 OpenIddictConstants.Permissions.Scopes.Profile
角色 OpenIddictConstants.Permissions.Scopes.Roles

要添加自定义的作用域权限,你可以使用以下模式:

OpenIddictConstants.Permissions.Prefixes.Scope + "custom_scope_name"

示例

在以下示例中,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();
    });

响应类型权限

响应类型权限是在 OpenIddict 3.0 中引入的。

定义

响应类型权限限制了客户端应用在实现如授权码、隐式或混合等交互式流程时被允许使用的响应类型。

支持的权限

响应类型 常量
code OpenIddictConstants.Permissions.ResponseTypes.Code
code id_token OpenIddictConstants.Permissions.ResponseTypes.CodeIdToken
code id_token token OpenIddictConstants.Permissions.ResponseTypes.CodeIdTokenToken
code token OpenIddictConstants.Permissions.ResponseTypes.CodeToken
id_token OpenIddictConstants.Permissions.ResponseTypes.IdToken
id_token token OpenIddictConstants.Permissions.ResponseTypes.IdTokenToken
none OpenIddictConstants.Permissions.ResponseTypes.None
token OpenIddictConstants.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();
    });
在本文档中