创建全新Orchard Core 项目:这是测试 OpenId 模块的基础。
启用 OpenId 模块: 在 Orchard Core 安装过程中或安装后启用相关模块。
配置 OpenId 客户端: 在 Orchard Core 后台配置一个客户端(例如,代表你的 Web API)。
创建一个简单的 .NET Core Web API 项目: 这个 API 将作为资源服务器,使用 OpenId 模块颁发的令牌进行认证。
配置 Web API 认证: 让 Web API 信任 Orchard Core 颁发的 JWT 令牌。
从 Orchard Core 获取令牌并测试 API。
备注:
OrchardCoreAuthServer
项目: 这是 认证服务器 (Authorization Server)。它负责用户认证、颁发令牌(包括 access_token
)。它同时也是一个 Orchard Core CMS 网站,可以托管其他内容和功能。
MySecureWebApi
项目: 这是一个独立的 ASP.NET Core Web API 项目,充当 资源服务器 (Resource Server)。它通过验证从认证 服务器获得的 JWT 令牌来保护自己的 API 端点
步骤一:创建并安装 Orchard Core 项目
1、点击创建
2、修改OrchardCoreAuthServer.csproj
文件
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="OrchardCore.Application.Cms.Targets" Version="2.1.7" />
</ItemGroup>
</Project>
3、修改 Program.cs
文件
// 如果之前删除了 using OrchardCore.Logging; 导致不报错,可以不加这行。
// 如果报错,说明你需要它,或者有其他配置问题。
// using OrchardCore.Logging;
var builder = WebApplication.CreateBuilder(args);
// 配置 Orchard Core 服务
// 这是将你的 ASP.NET Core 项目转换为 Orchard Core 的核心方法
builder.Services.AddOrchardCms();
// !!! 关键修复 !!!
// 在使用 app.UseAuthorization() 之前,必须先添加授权服务
builder.Services.AddAuthorization();
var app = builder.Build();
// 根据环境配置 HTTPS 和异常处理
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
// 强制使用 HTTPS 重定向
app.UseHttpsRedirection();
// 启用静态文件服务 (CSS, JS, 图片等)
app.UseStaticFiles();
// 启用路由
app.UseRouting();
// 启用认证中间件 (Orchard Core 会处理)
app.UseAuthentication();
// 启用授权中间件 (Orchard Core 会处理)
app.UseAuthorization();
// 使用 Orchard Core 中间件,这会处理 CMS 的请求和路由
app.UseOrchardCore();
app.Run();
4、运行项目:如果成功此时会打开界面如下
图片中数据库建议选择:SQLite
选择 SQLite
后,"连接字符串" 和 "表名前缀" 字段通常会自动清空或变成默认值,您可以留空或使用默认值
其他选项可根据需要填写
之后就可以看到完成之后的界面了:
步骤二:启用 Orchard Core 的 OpenId 模块
1、http://localhost:5233/Admin/ 来进行登录后台
2、找到 Configuration 配置,在下拉菜单中找到 Features,搜索 OpenID 关键字
将以上模块全部打开
步骤三:配置 OpenId 客户端
导航到 OpenID Connect Applications 页面:
在 Orchard Core 后台管理界面的左侧导航栏中,找到并点击 "Security" (安全)。
在展开的下拉菜单中,点击 "OpenID Connect"。
然后,点击 "Applications" (应用程序)。
创建新的应用程序 (客户端):
在 Applications 页面,点击页面右上角的 "Create New Application" (创建新应用程序) 按钮。
填写应用程序详细信息:
Display name (显示名称):
MyWebApi
(或者任何能够描述你的 Web API 应用的名称,用户在同意页面可能会看到这个名称)Client ID (客户端 ID):
mywebapi
(这是一个唯一的标识符,用于你的 Web API 在认证中心进行身份验证。请记住这个 ID。)Type (类型): 选择
Confidential
(保密)。解释:
Confidential
类型适用于后端应用程序(如你的 Web API),它们能够安全地存储客户端密钥。Public
类型用于浏览器或移动应用,因为它们无法安全地存储密钥。
Client secret (客户端密钥): 点击旁边的 "Generate Client Secret" (生成客户端密钥) 按钮。
【极其重要】:请立即复制这个生成的客户端密钥,并安全地保存它! 你只有这一次机会看到它。稍后在你的 .NET Core Web API 项目中配置认证时会用到它。
例如,生成的密钥可能看起来像
b2V31b3V31b3V31b3V31b3V31b3V31
(这只是一个示例,你的会不同)。
Permissions (Scopes) (权限/作用域):
勾选
openid
:表示客户端请求获取用户的身份信息。勾选
profile
:表示客户端请求获取用户的基本个人资料信息。勾选
offline_access
:如果你的 Web API 需要在用户不在线时刷新令牌(获取新的访问令牌),则需要勾选此项。对于大多数 Web API 场景,这是推荐的。在 "Resource List" (资源列表) 下,点击 "Add Resource" (添加资源) 按钮。 然后,在弹出的文本框中输入一个代表你的 Web API 的资源名称,例如:
api1
。解释: 这个
api1
就是你的 Web API 的逻辑名称,认证中心会用它来验证哪些客户端可以访问你的 API。
Redirect URIs (重定向 URI): (留空)。
解释: 重定向 URI 通常用于授权码流,当用户在浏览器中登录后,认证中心将授权码重定向回客户端的地址。由于你的 Web API 通常是后端服务,我们主要使用客户端凭证流或密码流进行测试,所以这里不需要配置。
Post Logout Redirect URIs (登出后重定向 URI): (留空)。
Grant types (授权类型):
勾选
Authorization Code
(授权码):如果你未来需要支持用户通过浏览器登录(例如,SPA 或 MVC 应用作为客户端,然后调用你的 Web API),这是最安全和推荐的流程。勾选
Client Credentials
(客户端凭证):这是最适合你的 Web API 直接使用客户端 ID 和密钥从认证中心获取令牌的流,用于机器到机器的通信。这是我们测试的主要方式。勾选
Password
(密码):这个授权类型允许客户端直接使用用户的用户名和密码从认证中心获取令牌。仅推荐用于测试目的,生产环境中应避免直接使用。勾选
Refresh Token
(刷新令牌):允许客户端使用刷新令牌来获取新的访问令牌,而无需用户重新认证。与offline_access
配合使用。
其他选项保持默认。
点击页面底部的 "Save" (保存) 按钮。
步骤四:创建 API 资源 (Scope)
在您当前显示的 "Scopes" 页面 (即
image_67e5e6.png
中的页面)。点击页面右上角的蓝色按钮 "New scope" (新建作用域)。
在弹出的表单中填写以下信息:
Name (名称):
api1
(这是您的 Web API 资源的唯一标识符,也是客户端请求该 API 时需要包含的scope
值。与我们之前在 Web API 配置中设定的options.Audience = "api1";
对应。)Display name (显示名称):
My Web API
(这是一个更友好的名称,用户在同意页面可能会看到它。)Description (描述):
Access to My Secure Web API
(对这个作用域的简要描述。)Resources (资源): 请确保勾选了
This scope is an API resource
(此作用域是一个 API 资源)。 这一步至关重要,它告诉 Orchard Core,这个作用域代表的是一个受保护的 API。其他选项保持默认即可。
点击页面底部的 "Save" (保存) 按钮。
然后回到 Applications 页面将刚刚创建 【api1】作用域 勾选上
步骤五:创建并配置 .NET Core Web API 项目
1、将MySecureWebApi
项目的 Program.cs
文件内容替换为以下代码:
// 如果之前删除了 using OrchardCore.Logging; 导致不报错,可以不加这行。
// 如果报错,说明你需要它,或者有其他配置问题。
// using OrchardCore.Logging;
var builder = WebApplication.CreateBuilder(args);
// 配置 Orchard Core 服务
// 这是将你的 ASP.NET Core 项目转换为 Orchard Core 的核心方法
builder.Services.AddOrchardCms();
// !!! 关键修复 !!!
// 在使用 app.UseAuthorization() 之前,必须先添加授权服务
builder.Services.AddAuthorization();
var app = builder.Build();
// 根据环境配置 HTTPS 和异常处理
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
// 强制使用 HTTPS 重定向
app.UseHttpsRedirection();
// 启用静态文件服务 (CSS, JS, 图片等)
app.UseStaticFiles();
// 启用路由
app.UseRouting();
// 启用认证中间件 (Orchard Core 会处理)
app.UseAuthentication();
// 启用授权中间件 (Orchard Core 会处理)
app.UseAuthorization();
// 使用 Orchard Core 中间件,这会处理 CMS 的请求和路由
app.UseOrchardCore();
app.Run();
2、修改 MySecureWebApi
项目的 Controllers/WeatherForecastController.cs
:
打开
MySecureWebApi
项目中的Controllers/WeatherForecastController.cs
文件。在控制器类上添加
[Authorize(Policy = "ApiScope")]
属性。
3、启动项目
4、获取令牌并测试 API
读取文档
已完成回答
Current time is Monday, June 16, 2025 at 10:33:17 AM +08.
好的,我看到您最新的截图 image_684fbd.png
。
这个截图显示了您的 MySecureWebApi
项目的 Program.cs
文件,并且您已经将 JWT Bearer 认证的配置代码粘贴进去了。
非常好的进展!您已经完成了 MySecureWebApi
的大部分配置。
但是,我注意到几点需要您再次确认和修正:
注释掉的
app.UseAuthorization();
和app.MapControllers();
: 在您的Program.cs
截图中,我看到第 22 行和 23 行// app.UseAuthorization();
和// app.MapControllers();
被注释掉了。 这两行是至关重要的,它们必须被取消注释才能让 ASP.NET Core Web API 正常工作和处理请求。请确保您的
Program.cs
的app
构建部分是这样的:C#
var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); app.UseAuthentication(); // 启用认证中间件 app.UseAuthorization(); // 启用授权中间件 app.MapControllers(); // 映射控制器路由 app.Run();
请您取消注释这两行,使它们生效。
WeatherForecastController.cs
是否添加了[Authorize(Policy = "ApiScope")]
属性? 虽然您没有提供WeatherForecastController.cs
的最新截图,但请务必确认您已经按照我之前的指示,在该控制器类上添加了[Authorize(Policy = "ApiScope")]
属性。C#
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using System.Security.Claims; namespace MySecureWebApi.Controllers; [ApiController] [Route("[controller]")] [Authorize(Policy = "ApiScope")] // 确保这一行已添加 public class WeatherForecastController : ControllerBase { // ... 其他代码 ... }
接下来,我们将进行最终的测试:
由于现在您有两个项目 (OrchardCoreAuthServer
和 MySecureWebApi
),您需要同时运行它们才能进行测试。
1. 配置 Rider 运行多个启动项目:
在 Rider 的顶部菜单栏,找到 "Run" (运行) 菜单。
选择 "Edit Configurations..." (编辑配置...)。
在左侧,点击
+
(加号) 按钮,选择 ".NET Build"。为这个新的配置命名,例如
RunBothProjects
。在右侧的 "Run projects" (运行项目) 下拉菜单中,选择 "Multiple projects" (多个项目)。
点击 "Add" (添加) 按钮,将您的
OrchardCoreAuthServer
和MySecureWebApi
项目都添加进去。确保两个项目旁边的 "Action" (操作) 都设置为 "Start browser" (启动浏览器)。
点击 "Apply" (应用),然后点击 "OK"。
2. 启动两个项目:
在 Rider 的顶部工具栏中,现在您应该能看到一个下拉菜单,显示您刚刚创建的
RunBothProjects
配置。选中
RunBothProjects
,然后点击旁边的 运行 (Run) 按钮 (绿色的播放图标)。
这将同时启动 OrchardCoreAuthServer
(您的认证中心) 和 MySecureWebApi
(您的受保护 API)。
3. 获取令牌并测试 API:
首先,您需要从 Orchard Core 认证中心获取一个访问令牌 (Access Token)。 我们将使用 Client Credentials
流,因为它最适合您的 Web API 直接从认证中心获取令牌来访问自身。
您可以使用 Postman (推荐) 或其他 API 测试工具(如 Swagger UI,但获取令牌更推荐 Postman/Curl)来执行以下操作:
获取访问令牌 (Access Token):
HTTP Method:
POST
URL:
https://localhost:7205/connect/token
(确保端口号与您的 Orchard Core 实例一致)Headers:
Content-Type: application/x-www-form-urlencoded
Body (x-www-form-urlencoded):
grant_type
:client_credentials
client_id
:mywebapi
(您在 Orchard Core 中创建的客户端 ID)client_secret
:你之前复制保存的客户端密钥
(这是最重要的,请务必粘贴正确的密钥!)scope
:api1
(您在 Orchard Core 中定义的 API 资源 Scope)
发送请求后,您应该会收到一个 JSON 响应,其中包含
access_token
、expires_in
等字段。复制access_token
的值。
调用受保护的 Web API (使用获取到的令牌):
HTTP Method:
GET
URL:
https://localhost:你的WebApi端口号/WeatherForecast
(例如,https://localhost:7001/WeatherForecast
。请检查MySecureWebApi
项目的launchSettings.json
来获取它的 HTTPS 端口。)Headers:
Authorization
:Bearer 你的Access_Token
(将你的Access_Token
替换为您上一步复制的值)
发送请求。
如果成功: 您应该会收到
WeatherForecast
的 JSON 响应。如果失败 (401 Unauthorized 或 403 Forbidden):
401 Unauthorized (未授权): 通常是令牌有问题(过期、无效、格式错误)或认证配置有问题。
403 Forbidden (禁止访问): 通常是令牌有效但缺少访问该资源的必要权限(例如
scope
不对)。