OpenIddict应用权限
@@openiddict Implicit
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限制为password和refresh_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 的特殊情况openid,offline_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, 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 中引入了响应类型权限。
定义
响应类型权限限制客户端应用程序在实现交互式流(如代码、隐式或混合)时允许使用的响应类型。
支持的权限
| 响应类型 | 持续的 |
|---|---|
| 代码 | 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();
});
浙公网安备 33010602011771号