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
限制为password
和refresh_token
grants:
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();
});