跳到主内容

MCP授权和范围

MCP 服务器通过 OAuth 范围实施细粒度授权。 当你使用访问令牌进行身份验证时,你可以访问的工具取决于该令牌中包含的范围。 这使您能够为特定自动化任务创建具有有限权限的令牌,遵循最小权限原则。

基于会话的身份验证(使用Cookie)会绕过范围检查,并授予对所有工具的完全访问权限。 这保持了与现有集成的向后兼容性,同时鼓励采用基于作用域的授权,以实现更佳的安全性。

基于范围的工具访问

每个MCP工具都需要特定的OAuth作用域。 对于应用管理工具,映射非常直观:

  • application:read 授予对 get_applicationsget_application 的访问权限
  • application:write 授予对 add_applicationupdate_applicationdelete_application 的访问权限

当您向 Casdoor 请求令牌时,请在授权请求中包含所需的范围。 MCP服务器会根据这些授予的范围筛选可用工具,确保自动化流程只能执行其明确获准的操作。

如果您使用作用域令牌调用tools/list,响应中仅包含您的令牌可访问的工具。 未经身份验证的请求仍会收到完整的工具列表,以方便发现,但任何尝试在未进行适当身份验证的情况下调用工具的行为都将失败。

范围验证错误

当你尝试使用未获得所需作用域的工具时,服务器会返回insufficient_scope错误:

{
"jsonrpc": "2.0",
"id": 10,
"error": {
"code": -32001,
"message": "insufficient_scope",
"data": {
"tool": "add_application",
"granted_scopes": ["application:read"],
"required_scope": "application:write"
}
}
}

此错误会明确告知你需要申请哪种作用域的新令牌,以获取相应的权限。 granted_scopes字段显示了您当前令牌所拥有的权限,而required_scope则指明了该操作所需的权限。

创建作用域令牌

在获取用于MCP访问的OAuth令牌时,请在授权请求中指定相应的作用域。 例如,要获取一个仅能读取应用但不能修改应用的令牌:

curl -X POST https://your-casdoor.com/api/login/oauth/access_token \
-d "grant_type=client_credentials" \
-d "client_id=YOUR_CLIENT_ID" \
-d "client_secret=YOUR_CLIENT_SECRET" \
-d "scope=application:read"

对于需要创建和更新应用的自动化任务,请申请写入范围:

curl -X POST https://your-casdoor.com/api/login/oauth/access_token \
-d "grant_type=client_credentials" \
-d "client_id=YOUR_CLIENT_ID" \
-d "client_secret=YOUR_CLIENT_SECRET" \
-d "scope=application:write"

您可以通过空格分隔来请求多个作用域:scope=application:read application:write(或在进行 URL 编码时为 scope=application:read%20application:write)。 该令牌随后将有权访问这些作用域涵盖的所有工具。

某些操作除了作用域授权之外,还有其他额外要求。 创建应用程序时会检查您组织的应用程序配额。 针对具有受限访问权限的应用程序执行IP白名单验证。 演示模式会应用额外的约束,以防止对演示实例进行修改。

完整作用域参考

Casdoor内置的MCP服务器支持跨多种资源类型的作用域。 每个作用域均遵循resource:action模式,其中resource标识实体类型,action指定操作级别。

应用程序作用域

作用域映射的工具描述
application:readget_application查看应用程序配置和设置
application:writeadd_applicationupdate_applicationdelete_application创建、修改和删除应用程序

用户范围

作用域映射的工具描述
user:readget_user查看用户个人资料和信息
user:writeadd_userupdate_userdelete_user创建、修改和删除用户账户

组织范围

作用域映射的工具描述
organization:readget_organization查看组织详情和设置
organization:writeadd_organizationupdate_organizationdelete_organization创建、修改和删除组织

角色范围

作用域映射的工具映射的工具
role:readget_role查看角色定义和分配
role:writeadd_role, update_role, delete_role创建、修改和删除角色

权限范围

作用域映射的工具描述
permission:readget_permission查看权限配置
permission:write添加权限更新权限删除权限创建、修改和删除权限

提供商范围

作用域映射的工具描述
provider:readget_provider查看OAuth、短信、电子邮件及其他提供商配置
provider:write添加提供商更新提供商删除提供商`创建、修改和删除提供商集成

令牌范围

作用域映射的工具描述
token:readget_tokens查看访问令牌及其元数据
token:writedelete_token删除访问令牌

第三方MCP服务器的自定义范围

在使用Casdoor作为OAuth提供商构建您自己的MCP服务器时,您可以定义自定义作用域以匹配您服务器的功能。 这使得您可以实现超越Casdoor内置作用域的细粒度授权。

要配置自定义范围:

  1. 在Casdoor管理面板中,将您的应用程序的类别设置为“代理”
  2. 在应用程序配置中添加自定义范围,包括名称、显示名称和描述
  3. 您的MCP服务器会验证访问令牌的scope声明中的这些作用域
  4. 这些作用域会显示在OIDC发现端点和同意屏幕中

有关配置,请参阅自定义作用域

文件管理MCP服务器的自定义作用域示例:

名称显示名称描述
files:read读取文件查看并下载存储中的文件
files:write写文件创建、修改和删除文件
metadata:read读取元数据查看文件元数据和属性

同意屏幕配置

当用户授权MCP客户端时,Casdoor会显示一个同意屏幕,其中列出所请求的作用域。 同意屏幕会使用您为每个作用域配置的显示名称描述字段。

要控制同意屏幕的显示时间:

  1. 导航至Casdoor中的应用配置
  2. 设置同意策略字段:
    • 始终:在每次授权请求时显示同意屏幕
    • 仅一次:仅在首次授权时显示同意屏幕
    • 绝不:跳过同意屏幕(不建议用于第三方客户端)

同意屏幕会列出所有请求的范围及其显示名称和描述,让用户在批准请求之前了解他们正在授予哪些权限。

使用Casbin实现细粒度授权

对于超出简单范围的授权需求,Casdoor集成了Casbin,以提供细粒度访问控制。 Casbin策略可基于以下内容实施复杂规则:

  • 用户属性(组织、角色、部门)
  • 资源属性(所有者、敏感级别)
  • 环境因素(时间、地点、IP地址)
  • 关系 (用户是所有者,用户是团队成员)

要在您的MCP服务器中使用Casbin:

  1. 在Casdoor中定义一个描述您的授权规则的Casbin模型
  2. 创建一个权限资源,将您的应用链接到Casbin模型
  3. 配置将用户、角色和范围映射到特定操作的策略
  4. 您的MCP服务器通过在验证范围后检查权限来实施这些策略

Casbin 授权会在范围验证之外运行。 请求必须同时通过作用域检查和Casbin策略执行,才能成功。 有关Casbin集成,请参阅权限