目录

OpenIddict应用权限

OpenIddict 包括一个代号为“应用程序权限”的内置功能, 允许控制和限制每个注册的客户端应用程序能够使用的 OAuth 2.0/OpenID Connect 功能

目前支持 4 类权限:

  • 端点权限。
  • 授予类型权限。
  • 范围权限。
  • 响应类型权限(在 OpenIddict 3.0 中引入)。

端点权限

定义

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

支持的权限

端点 持续的
授权 OpenIddictConstants.Permissions.Endpoints.Authorization
内省 OpenIddictConstants.Permissions.Endpoints.Introspection
注销/结束会话 OpenIddictConstants.Permissions.Endpoints.Logout
撤销 OpenIddictConstants.Permissions.Endpoints.Revocation
代币 OpenIddictConstants.Permissions.Endpoints.Token

例子

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

授予类型权限

定义

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

支持的权限

资助类型 持续的
授权码 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应用程序只能使用授权码 grant 而被console限制为passwordrefresh_tokengrants:

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

范围权限

定义

范围权限限制允许客户端应用程序使用的范围(标准或自定义)。

笔记

和范围是 OpenIddict 的特殊情况openidoffline_access不需要明确的权限。

支持的权限

范围 持续的
地址 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允许客户端请求address, profilemarketing_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 中引入了响应类型权限。

定义

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

支持的权限

响应类型 持续的
代码 OpenIddictConstants.Permissions.ResponseTypes.Code
代码 id_token OpenIddictConstants.Permissions.ResponseTypes.CodeIdToken
代码 id_token 令牌 OpenIddictConstants.Permissions.ResponseTypes.CodeIdTokenToken
代号 OpenIddictConstants.Permissions.ResponseTypes.CodeToken
id_token OpenIddictConstants.Permissions.ResponseTypes.IdToken
id_token 令牌 OpenIddictConstants.Permissions.ResponseTypes.IdTokenToken
没有任何 OpenIddictConstants.Permissions.ResponseTypes.None
令牌 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();
    });