using Dpz.Core.Entity.Base;

namespace Dpz.Core.Public.Entity.Auth;

public class DpzApplication : BaseEntity
{
    /// <summary>
    /// 客户端id
    /// </summary>
    public required string ClientId { get; set; }

    /// <summary>
    /// 客户端密钥
    /// </summary>
    public string? ClientSecret { get; set; }

    /// <summary>
    /// 显示名称
    /// </summary>
    public string? DisplayName { get; set; }

    /// <summary>
    /// 重定向地址
    /// </summary>
    public string? RedirectUris { get; set; }

    /// <summary>
    /// 登出重定向地址
    /// </summary>
    public string? PostLogoutRedirectUri { get; set; }

    /// <summary>
    /// 应用类型
    /// </summary>
    public string? ApplicationType { get; set; }

    /// <summary>
    /// 客户端类型
    /// </summary>
    public string? ClientType { get; set; }

    /// <summary>
    /// 权限
    /// </summary>
    public List<string> Permissions { get; set; } = [];

    /// <summary>
    /// 附加属性
    /// </summary>
    public BsonDocument Properties { get; set; } = [];
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这段代码定义了一个表示“应用/客户端”信息的实体类 DpzApplication(继承自 BaseEntity)。通常用于授权/认证场景(如 OAuth/OpenID Connect 客户端元数据),并且看起来是为 MongoDB (BsonDocument)等持久化场景准备的。下面按成员逐项解释并给出一些设计与安全上的建议。

总体

  • 类名:DpzApplication,继承自 BaseEntity(BaseEntity 一般会包含诸如 Id、CreatedAt、UpdatedAt 等基础字段)。
  • 作用:封装一个客户端/应用在认证系统中的配置信息(例如 client_id、client_secret、重定向地址、权限等)。

属性说明

  • public required string ClientId { get; set; }

    • 客户端标识(client_id)。使用 C# 的 required 修饰,表示对象初始化器必须为这个属性赋值(C# 11 特性)。
    • 通常是唯一且不可为空的字符串。
  • public string? ClientSecret { get; set; }

    • 客户端密钥(client_secret)。允许为 null(例如公开客户端没有 secret)。
    • 安全建议:不要以明文存储或直接返回给不可信方,应做加密/哈希并限制访问。
  • public string? DisplayName { get; set; }

    • 可展示的客户端名称,便于 UI 显示。
  • public string? RedirectUris { get; set; }

    • 重定向地址(redirect_uri)。目前类型是单个字符串,可能存储一个或多个 URL(例如逗号分隔)。
    • 建议:如果支持多个重定向地址,最好使用 List 或集合类型而不是单一字符串,以便更易于验证与操作。
  • public string? PostLogoutRedirectUri { get; set; }

    • 注销后重定向地址(post_logout_redirect_uri)。同上,若支持多个建议用集合。
  • public string? ApplicationType { get; set; }

    • 应用类型(例如 web、native、single_page_app 等)。建议可用枚举类型以保证有效值。
  • public string? ClientType { get; set; }

    • 客户端类型(例如 public 或 confidential);也建议用枚举或常量。
  • public List Permissions { get; set; } = [];

    • 权限列表(scopes、grants 或自定义权限名)。默认初始化为空集合。
    • 注意:代码里用的 [] 作默认值在常规 C# 语法中不是标准写法,推荐使用 new List() 或 new()。
  • public BsonDocument Properties { get; set; } = [];

    • 附加属性(灵活的键值结构),使用 BsonDocument(MongoDB 的 BSON 文档类型),适合存放不固定/可扩展的元数据。
    • 同样,初始化应使用 new BsonDocument() 而不是 []。
    • 如果不使用 MongoDB,等价可用 Dictionary<string, object> 或自定义 JSON 字段。

设计与安全建议(要点)

  • ClientSecret 安全

    • 不要以明文存储。对机密做哈希或使用受保护的密钥存储(KMS、vault)。
    • 返回给 API 客户端时应谨慎,通常只在创建时返回一次。
  • 类型与验证

    • 将 ApplicationType、ClientType 改为枚举可以降低错误赋值。
    • RedirectUris、PostLogoutRedirectUri 建议改为集合类型(List),并对每个 URL 做严格校验(scheme、主机、端口、禁止通配符等)。
  • 集合与并发

    • Permissions 可用 HashSet(视是否需要去重与快速查找)或 IReadOnlyCollection 暴露只读视图。
  • 可序列化/持久化

    • 使用 BsonDocument 表示扩展属性时,注意序列化行为与驱动兼容。
    • 如果持久化到关系型数据库,BsonDocument 不适合,需使用 JSON 字段或关联表。
  • 语法注意

    • 这里的 = [] 写法在标准 C# 中不合法。正确的初始化写法示例:
      • Permissions = new List();
      • Properties = new BsonDocument();

示例(简化示意)

  • 一个典型实例可能表示为:
    • ClientId = "my-app"
    • ClientSecret = "(哈希后的值)"
    • DisplayName = "My Application"
    • RedirectUris = ["https://app.example.com/signin-oidc"]
    • Permissions = ["openid", "profile", "email"]
    • Properties = { "logo": "https://...", "contact": "admin@example.com" }

总结

  • 该类用于表示认证系统中的应用/客户端信息,包含识别、认证(secret)、回调地址、类型、权限及扩展属性等。
  • 需要注意对敏感字段的保护、改进字段类型(集合/枚举)以及修正初始化语法以保证代码可编译和运行。若需要,我可以帮你把这段类改成更健壮或更适合你存储后端(MongoDB/关系型)的实现版本。
评论加载中...