ASP.NET Core IdentityServer4权限认证1.0

一、创建新的 ASP.NET Core Web API 项目

打开 Visual Studio,点击 创建新项目。

1.选择

 ASP.NET Core Web API 模板,点击 下一步。

2.设置项目名称

如 IdentityServer4Demo,并选择保存位置,点击 创建。

3.选择目标框架

二、安装 IdentityServer4 包

1.在解决方案资源管理器中,

右键点击项目名称(IdentityServer4Demo)并选择 管理 NuGet 包。

2.在浏览选项卡中搜索 Duende.IdentityServer 并点击 安装。

注意:从 IdentityServer4 v4 开始,由 Duende 维护,所以使用 Duende.IdentityServer 包。

3.配置 IdentityServer

接下来,你需要在项目中配置 IdentityServer。

(1) 修改 Program.cs

在 .NET 6 或更高版本中,Startup.cs 已经合并到了 Program.cs 中。你需要在 Program.cs 中进行以下修改。

  1. 找到builder.Services 部分,添加 IdentityServer 的服务,appsetting.json中添加相应配置:
    "IdentityServer": {
    "Authority": "http://localhost:5000",
    "Audience": "api1"
    }
    下面是全部 Program.cs 代码:
using IdentityDemo.Helper;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;

var builder = WebApplication.CreateBuilder(args);

// 加载配置信息
var configuration = builder.Configuration;
var environment = builder.Environment;

// 添加 IdentityServer 服务
var identityServerBuilder = builder.Services.AddIdentityServer()
    .AddInMemoryClients(IdentityConfig.Clients)               // 加载客户端配置
    .AddInMemoryApiScopes(IdentityConfig.ApiScopes)           // 加载 API 范围配置
    .AddInMemoryApiResources(IdentityConfig.ApiResources)     // 加载 API 资源配置
    .AddInMemoryIdentityResources(IdentityConfig.IdentityResources); // 加载身份资源配置

// 使用开发者签名证书仅在开发环境
if (environment.IsDevelopment())
{
    identityServerBuilder.AddDeveloperSigningCredential();  // 开发环境使用开发签名证书
}
else
{
    // 在生产环境中应使用真实的签名凭据
    // identityServerBuilder.AddSigningCredential(...);
}

// JWT 身份验证
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.Authority = configuration["IdentityServer:Authority"] ?? "http://localhost:5000"; // 从配置文件中读取 Authority
        options.Audience = configuration["IdentityServer:Audience"] ?? "api1";  // 确保这个与配置的 API 范围一致
        options.RequireHttpsMetadata = !environment.IsDevelopment(); // 仅在生产环境强制使用 HTTPS
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            // 如果你想允许所有 API 可访问,可以取消注释以下代码:
            // ValidAudience = "yourapi", // 可以从配置文件中设置 Audience
            // ValidIssuer = "http://localhost:5000", // 可以从配置文件中设置 Issuer
        };
    });

// 添加控制器服务
builder.Services.AddControllers();

// 添加日志记录服务(可选)
builder.Services.AddLogging();

var app = builder.Build();

// 配置 HTTP 请求管道

// 根据环境配置 HTTPS 强制策略
if (!environment.IsDevelopment())
{
    app.UseHttpsRedirection();  // 生产环境强制使用 HTTPS
}

app.UseRouting();

// 启用 IdentityServer 中间件
app.UseIdentityServer();  // 这一步要在 UseAuthorization 之前

// 启用授权
app.UseAuthorization();

app.MapControllers();

app.Run();
(2) 配置 IdentityServer 资源

在项目中,右键点击项目名并选择 添加 -> 新建文件,选择 类,命名为 Config.cs。

在 Config.cs 中,定义 IdentityServer 资源、客户端、API 范围等:

using Duende.IdentityServer.Models;

namespace IdentityDemo.Helper
{
    public class IdentityConfig
    {
        // 定义身份资源(Identity Resources)
        public static IEnumerable<IdentityResource> IdentityResources =>
            new IdentityResource[]
            {
            new IdentityResources.OpenId(),
            new IdentityResources.Profile()
            };

        // 定义 API 范围(API Scopes)
        public static IEnumerable<ApiScope> ApiScopes =>
            new ApiScope[]
            {
            new ApiScope("api1", "My API")
            };

        // 定义 API 资源(API Resources)
        public static IEnumerable<ApiResource> ApiResources =>
            new ApiResource[]
            {
            new ApiResource("api1", "My API")
            {
                Scopes = { "api1" }
            }
            };

        // 定义客户端(Clients)
        public static IEnumerable<Client> Clients =>
            new Client[]
            {
            // 客户端凭证流
            new Client
            {
                ClientId = "client",
                AllowedGrantTypes = GrantTypes.ClientCredentials, // 客户端凭证流
                ClientSecrets =
                {
                    new Secret("secret".Sha256()) // 客户端秘钥
                },
                AllowedScopes = { "api1" } // 允许的 API 范围
            },

            // 授权码流(用于前端应用)
            new Client
            {
                ClientId = "mvc",
                ClientName = "MVC Client",
                AllowedGrantTypes = GrantTypes.Code,

                // Redirect URLs after login/logout
                RedirectUris = { "https://localhost:5002/signin-oidc" },
                PostLogoutRedirectUris = { "https://localhost:5002/signout-callback-oidc" },

                // Secret for authentication
                ClientSecrets = { new Secret("secret".Sha256()) },

                // Scopes that client has access to
                AllowedScopes = new List<string>
                {
                    "openid", "profile", "api1"
                },

                // Enable PKCE for security
                RequirePkce = true,
                AllowPlainTextPkce = false
            }
            };

    }
        
    
}

4. 创建受保护的 API

为了测试 IdentityServer4 的身份验证,你可以创建一个受保护的 API。

  1. 右键点击 Controllers 文件夹,选择 添加 -> 控制器,选择 API Controller 模板,命名为 TestController。
  2. 在TestController.cs 中,使用 [Authorize] 属性标记 API,使其成为受保护的资源:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace IdentityServer4Demo.Controllers
{

    [Authorize] // 需要身份验证
    [ApiController]
    [Route("[controller]")]
    public class TestController : ControllerBase
    {
        [HttpGet]
        public IActionResult Get()
        {
            return Ok("Hello from a protected API!");
        }
    }
}

5. 运行并测试 IdentityServer

        1.启动项目
        2.获取访问令牌

使用 Apifox 示例:

如果请求成功,你将会收到一个带有 access_token 的响应。

        3.使用访问令牌调用受保护的 API

示例请求:

如果身份验证成功,你将会看到返回的消息:Hello from a protected API!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是来拉屎的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值