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
应用则被限制使用 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();
});
作用域权限
定义
作用域权限限制了客户端应用被允许使用的作用域(标准或自定义)。
openid
和offline_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
客户端被允许请求 address
、profile
和 marketing_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();
});