<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://limyee.comhttps://limyee.com/cfs-file/__key/system/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>连易科技</title><link /><description /><dc:language>zh-CN</dc:language><generator>Limyee 5</generator><item><title>文章：How do I control which Active Directory (AD) fields are synchronized and editable on member profiles?</title><link>https://limyee.com/helps/a/developer-documentation/DD920/how-do-i-control-which-active-directory-ad-fields-are-synchronized-and-editable-on-member-profiles</link><pubDate>Thu, 24 Sep 2026 02:42:00 GMT</pubDate><guid isPermaLink="false">ce2a2671-8a8a-4f4b-bf55-68c8b1789e45:d1488db8-aa2c-4736-9cc9-ccda56835313</guid><dc:creator>系统管理员</dc:creator><description> The LDAP.config file contains all of the attributes that will be shared by Limyee and your LDAP source. Using LDAP.config , you can control how the LDAP fields are grouped and viewed/edited on a user&amp;#39;s profile page. In this article we will take a look at the various items found in LDAP.config . You can find LDAP.config at :\program files\limyee\web (by default). Let&amp;#39;s take a look at each section in the out of the box LDAP.config : CoreAttributes Here is the out-of-the-box sample for the CoreAttributes section of the LDAP.config file: Below you will find a description for each of the elements found in the CoreAttributes object: Attribute Name Attribute Description UserObjectClass Corresponds to the class in LDAP under which your users are stored. This should only be changed if you do not query your LDAP source as objectClass=user when searching for users. GroupObjectClass Corresponds to the class in LDAP under which your groups are stored. This should only be changed if you do not query your LDAP source as objectClass=group when searching for groups. GroupNameIdentifier Tells Limyee which LDAP field to use when looking up the identifying name for a group. UserEmail Tells Limyee which LDAP field to use when looking up a user&amp;#39;s email address. UserDomainName Tells Limyee which LDAP field to use when referencing the domain username for a given user. Our example uses &amp;quot; samaccountname &amp;quot;, which translates into a domain username such as &amp;#39;jdoe&amp;#39;. UserCommonName Tells Limyee which LDAP field to use when looking up the user&amp;#39;s common name. An example common name might be &amp;#39;John Doe&amp;#39;. Contacts Here is the out-of-the-box sample for the Contacts section of the LDAP.config file: Below you will find the attribute name and descriptions for the Contacts object: Attribute Name Attribute Description EnableSyncContacts Possible values are true/false. Determines whether contact information should be synchronized between Community and the LDAP source. ObjectClass Corresponds to the class in the example codebase that contains the contact information. This should not be modified unless you&amp;#39;ve changed the corresponding code using the SDK. CommonName This value should correspond to the LDAP field where the common name is stored. BaseDN This value should correspond to the base distinguished name for the contacts object within your LDAP source. Below you will find the attribute name and descriptions for the Attribute object: Attribute Name Attribute Description Name The name of the contacts LDAP attribute to be set by the attribute tag. Value The value of the attribute. AttributeGroup There are two AttributeGroup sections in the out-of-the-box LDAP.config document that you may desire to modify. The Attribute objects in these sections control which LDAP/Active Directory fields are available to users inside of Limyee. Here is markup from the out-of-the-box LDAP.config file that shows what an AttributeGroup looks like: The AttributeGroup object has the following attributes: Attribute Name Attribute Description Name The name of the attribute will be used as the tab name in the user profile. Order The order value controls the order in which the tabs will be displayed in the user profile. This must be a unique value across all AttributeGroups . The Attribute object has the following attributes: Attribute Name Attribute Description Name The name of the LDAP field being used. DisplayAs The text that will be shown to users in Limyee. AccessLevel The value controls whether the user can read or edit the value in the user profile. Default = ReadOnly Read/write functionality requires an LDAP service account with read/write permissions. You can customize the LDAP fields that Limyee displays in the user profile, and you can add or remove items or whole groups of items if you desire. For example, perhaps your organization relies heavily on instant messaging (IM) and your employees change their IM addresses on occasion. You might consider creating an &amp;quot;IM&amp;quot; profile group in the user profile so users can update their IM addresses and view the IM addresses of others in your organization: First, you would need to create an AttributeGroup that looks something like this: The markup above will create a tab in the user profile with the label &amp;quot;IM&amp;quot;. Since there are two AttributeGroups defined in the out-of-the-box LDAP.config file, we would set the Order to &amp;quot;3&amp;quot; so it will be the third tab in the user profile. Next, we need to add the IM address fields for each of the IM services that the employees use regularly. The markup might look like this: The first object has an AccessLevel of &amp;quot;ReadOnly&amp;quot;. This means that users will not be able to update this value in the user profile; they will be able to view the value. </description></item><item><title>文章：Forms 认证</title><link>https://limyee.com/helps/a/developer-documentation/DD919/forms</link><pubDate>Sat, 19 Sep 2026 14:46:00 GMT</pubDate><guid isPermaLink="false">ce2a2671-8a8a-4f4b-bf55-68c8b1789e45:6d32864f-091c-4407-b69d-ca0f2c617ec4</guid><dc:creator>系统管理员</dc:creator><description> 如果你已经有一个基于 ASP.NET 或 ASP.NET Core 的登录系统，并且你希望使用这个系统登录 Limyee CMS，那么你应该使用 Forms 认证。 启用 Forms SSO 后，会发生以下情况： 平台的登录和注册 URL 被重定向到指向外部身份验证系统 当外部登录系统登录用户时，将设置一个基于 ASP.NET 或 ASP.NET Core 的用户验证 cookie，允许 Limyee CMS 登录此用户，如果不存在帐户时将创建其新帐户。 Forms SSO 的工作原理 Forms SSO 通过 HTTP Cookie 将有关登录用户的安全消息从您的外部系统传递到 Limyee CMS。此消息是使用 ASP.NET 或 ASP.NET Core 提供的用户登录方式生成的。Limyee CMS 会自动验证消息并生成上下文用户。 当用户登录到您的主单点登录系统时，它将使用 ASP.NET 或 ASP.NET Core 的登录方式，并创建一个 Cookie，其中包含有关用户会话的数据。 当用户访问您的 Limyee CMS 时， Limyee CMS 将读取此 Cookie 会话数据。 如果存在给定用户名的用户，则登录该用户。 如果该用户不存在，则使用指定的会话数据创建一个新用户，然后登录该用户。 Forms SSO 的限制 要使 Forms SSO 正常工作，Cookie 需要在外部身份验证系统和平台之间共享。 由于浏览器允许共享 cookie 的方式，这意味着您的平台和登录页面必须使用相同的域名。 例如，login.example.com 和 mobile. example .com 使用相同的域：. example .com，因此可以与Forms SSO一起使用。请转到“ 系统管理&amp;gt;身份验证&amp;gt;域名 ”进行设置。 要使不同的系统能交互登录信息，必须使用相同的密钥保护数据，并将密钥设置相同的应用名。还应使用相同的授权方案类型，设置相同的 cookie 名称。 ASP.NET [embed:6f64e35a-7275-4533-8e08-1ec69052024e:83760140-b440-4eb9-a620-338332b9e780:type=csharp&amp;amp;text=app.UseCookieAuthentication(new+CookieAuthenticationOptions%0A%7B%0A++++LoginPath+%3D+new+PathString(%22%2FAccount%2FLogin%22)%2C%0A++++Provider+%3D+new+CookieAuthenticationProvider%0A++++%7B%0A++++++++OnValidateIdentity+%3D+SecurityStampValidator.OnValidateIdentity%3CApplicationUserManager%2C+ApplicationUser%3E(%0A++++++++++++validateInterval%3A+TimeSpan.FromMinutes(30)%2C%0A++++++++++++regenerateIdentity%3A+(manager%2C+user)+%3D%3E+user.GenerateUserIdentityAsync(manager))%0A++++%7D%2C%0A%0A++++%2F%2F+Settings+to+configure+shared+cookie+with+ASP.NET+Core+app%0A++++CookieName+%3D+%22.Limyee%22%2C%0A++++CookieDomain+%3D+%22.example.com%22%2C%0A++++CookieHttpOnly+%3D+true%2C%0A++++AuthenticationType+%3D+%22Authentication%22%2C%0A++++TicketDataFormat+%3D+new+AspNetTicketDataFormat(%0A+++++++new+DataProtectorShim(%0A+++++++++++DataProtectionProvider.Create(new+DirectoryInfo(%22PATH+TO+COMMON+KEY+RING+FOLDER%22)%2C%0A+++++++++++%2F%2F+Application+name+must+be+corresponding+with+Limyee+CMS%0A+++++++++++builder+%3D%3E+builder.SetApplicationName(%22LimyeeApp%22))%0A+++++++++++.CreateProtector(%0A+++++++++++++++%22Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware%22%2C%0A+++++++++++++++%2F%2F+Must+match+the+Scheme+name+used+in+the+ASP.NET+Core+app%2C+i.e.+IdentityConstants.ApplicationScheme%0A+++++++++++++++%22Authentication%22%2C%0A+++++++++++++++%22v2%22)))%2C%0A++++CookieManager+%3D+new+ChunkingCookieManager()%0A%7D)%3B] ASP.NET Core [embed:6f64e35a-7275-4533-8e08-1ec69052024e:88bc8ee6-7b22-4b45-b089-aa5b91970d91:type=csharp&amp;amp;text=builder.Services.AddDataProtection()%0A++++.PersistKeysToFileSystem(new+DirectoryInfo(%22PATH+TO+COMMON+KEY+RING+FOLDER%22))%0A++++%2F%2F+Application+name+must+be+corresponding+with+Limyee+CMS%0A++++.SetApplicationName(%22LimyeeApp%22)%3B%0A%0A%2F%2Fset+default+authentication+schemes%0Avar+authenticationBuilder+%3D+services.AddAuthentication(options+%3D%3E%0A%7B%0A++++options.DefaultChallengeScheme+%3D+%22Authentication%22%3B%0A++++options.DefaultScheme+%3D+%22Authentication%22%3B%0A++++options.DefaultSignInScheme+%3D+%22Authentication%22%3B%0A%7D)%3B%0A%0A%2F%2Fadd+main+cookie+authentication%0AauthenticationBuilder.AddCookie(%22Authentication%22%2C+options+%3D%3E%0A%7B%0A++++options.Cookie.Name+%3D+%22.Limyee%22%3B%0A++++options.Cookie.HttpOnly+%3D+true%3B%0A++++options.Cookie.Domain+%3D+%22.example.com%22%3B%0A%7D)%3B] 声名类型设置 名称 值 类型 描述 必填 电子邮件 http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress email 用于获取用户的电子邮件地址的类型。用户的电子邮件地址必须是唯一的。 否 个人资料 http://schemas.xmlsoap.org/ws/2005/05/identity/claims/profile string 用于获取用户的个人资料类型，并更新用户的个人资料。 否 角色 http://schemas.microsoft.com/ws/2008/06/identity/claims/role string 用于获取用户的角色类型，用于更新用户的角色。 否 个人资料字段 序列化为多值的类型 CommonName=EXAMPL&amp;amp;Timezone=China+Standard+Time%3b480%3b(UTC%2b08%3a00)+Beijing%2c+Chongqing%2c+Hong+Kong%2c+Urumqi%3bChina+Standard+Time%3bChina+Daylight+Time%3b%3b 包含用户的昵称：CommonName 和用户资料包括但不全包括以下： BirthDate (DateTime) Gender (NotSet|Male|Female) EnableEmoticons (bool) DateFormat (string) Bio (string) PublicEmail (string) Language (string) WebAddress (string) WebLog (string) Signature (string) Location (string) Occupation (string) Timezone (TimeZoneInfo) 角色字段 以英文逗号(,)相隔的 CSV 格式列表，用户将自动添加到 Everyone 和 Registered Users 角色中，而无需任何指派。 roles=Administrators,Moderators 创建声明 登录系统需要登入用户时，创建声明数据，以便 Limyee CMS 读取。声明的颁发者（Issuer）参数为 Limyee CMS 的 tenant ID。如果你 Limyee CMS 未开启租赁模式，则 tenant ID 为空的 GUID。 ASP.NET 通常在文件 Models/IdentityModels.cs [embed:6f64e35a-7275-4533-8e08-1ec69052024e:99998ca9-7e50-4685-a1bc-7e0ad38ca29d:type=csharp&amp;amp;text=public+class+ApplicationUser+%3A+IdentityUser%0A%7B%0A++++public+ClaimsIdentity+GenerateUserIdentity(ApplicationUserManager+manager)%0A++++%7B%0A++++++++%2F%2F+Note+the+authenticationType+must+match+the+one+defined+in+UseCookieAuthentication%0A++++++++var+userIdentity+%3D+manager.CreateIdentity(this%2C+%22Authentication%22)%3B%0A%0A++++++++%2F%2F+Add+custom+user+claims+here%0A++++++++var+claimsIssuer+%3D+Guid.Empty.ToString()%3B%0A++++++++userIdentity.AddClaim(new+Claim(ClaimTypes.Name%2C+%22example%22%2C+ClaimValueTypes.String%2C+claimsIssuer))%3B%0A++++++++userIdentity.AddClaim(new+Claim(ClaimTypes.Email%2C+%22example%40example.com%22%2C+ClaimValueTypes.Email%2C+claimsIssuer))%3B%0A++++++++userIdentity.AddClaim(new+Claim(%22http%3A%2F%2Fschemas.xmlsoap.org%2Fws%2F2005%2F05%2Fidentity%2Fclaims%2Fprofile%22%2C+%22CommonName%3DEXAMPL%26Timezone%3DChina%2BStandard%2BTime%253b480%253b(UTC%252b08%253a00)%2BBeijing%252c%2BChongqing%252c%2BHong%2BKong%252c%2BUrumqi%253bChina%2BStandard%2BTime%253bChina%2BDaylight%2BTime%253b%253b%22%2C+ClaimValueTypes.String%2C+claimsIssuer))%3B%0A++++++++userIdentity.AddClaim(new+Claim(ClaimTypes.Role%2C+%22roles%3DAdministrators%22%2C+ClaimValueTypes.String%2C+claimsIssuer))%3B%0A%0A++++++++return+userIdentity%3B%0A++++%7D%0A%0A++++public+Task%3CClaimsIdentity%3E+GenerateUserIdentityAsync(ApplicationUserManager+manager)%0A++++%7B%0A++++++++return+Task.FromResult(GenerateUserIdentity(manager))%3B%0A++++%7D%0A%7D] ASP.NET Core [embed:6f64e35a-7275-4533-8e08-1ec69052024e:7425f195-ace7-48d3-b11e-43690d397f1b:type=csharp&amp;amp;text=public+async+Task+UserSignInAsync(HttpContext+context)%0A%7B%0A++++var+claimsIssuer+%3D+Guid.Empty.ToString()%3B%0A++++var+claims+%3D+new+List%3CClaim%3E%0A++++%7B%0A++++++++new+Claim(ClaimTypes.Name%2C+%22example%22%2C+ClaimValueTypes.String%2C+claimsIssuer)%2C%0A++++++++new+Claim(ClaimTypes.Email%2C+%22example%40example.com%22%2C+ClaimValueTypes.Email%2C+claimsIssuer)%2C%0A++++++++new+Claim(%22http%3A%2F%2Fschemas.xmlsoap.org%2Fws%2F2005%2F05%2Fidentity%2Fclaims%2Fprofile%22%2C+%22CommonName%3DEXAMPL%26Timezone%3DChina%2BStandard%2BTime%253b480%253b(UTC%252b08%253a00)%2BBeijing%252c%2BChongqing%252c%2BHong%2BKong%252c%2BUrumqi%253bChina%2BStandard%2BTime%253bChina%2BDaylight%2BTime%253b%253b%22%2C+ClaimValueTypes.String%2C+claimsIssuer)%2C%0A++++++++new+Claim(ClaimTypes.Role%2C+%22roles%3DAdministrators%22%2C+ClaimValueTypes.String%2C+claimsIssuer)%0A++++%7D%3B%0A%0A++++%2F%2Fcreate+principal+for+the+current+authentication+scheme%0A++++var+userIdentity+%3D+new+ClaimsIdentity(claims%2C+AuthenticationDefaults.AuthenticationScheme)%3B%0A++++var+userPrincipal+%3D+new+ClaimsPrincipal(userIdentity)%3B%0A%0A++++%2F%2Fset+value+indicating+whether+session+is+persisted+and+the+time+at+which+the+authentication+was+issued%0A++++var+authenticationProperties+%3D+new+AuthenticationProperties%0A++++%7B%0A++++++++IsPersistent+%3D+true%2C%0A++++++++IssuedUtc+%3D+DateTime.UtcNow%2C%0A++++++++ExpiresUtc+%3D+DateTime.UtcNow.AddDays(7)%0A++++%7D%3B%0A%0A++++%2F%2Fsign+in%0A++++await+context.SignInAsync(AuthenticationDefaults.AuthenticationScheme%2C+userPrincipal%2C+authenticationProperties)%3B%0A%7D] 故障排除 Limyee CMS 是使用基于 ASP.NET 或 ASP.NET Core 的 HttpContext 进行登录，如果 Limyee CMS 无法处理 SSO cookie，HttpContext 的 User 将设置为未认证，用户无法登录到系统，此过程不会抛出错误。你需查看子域名、密钥、授权方案类型和声明等的设置是否一致。 如果您无法访问控制面板（例如，由于 Forms SSO 配置问题而无法再登录），则可以使用紧急访问页面返回您的平台。您必须在服务器上访问此页面。页面地址： {{Limyee Site Url}}/localaccess，它将允许您在启用 Forms SSO 插件之前使用凭据登录。 使用 Forms SSO 的安全和隐私注意事项 使用电子邮件地址作为用户名 您不应使用电子邮件地址作为用户名。用户名用作平台中用户的可见唯一标识符，因此，如果使用电子邮件地址代替用户名将导致用户的电子邮件地址公开。如果您的现有系统使用电子邮件地址作为用户名，那么您应该考虑使用其他内容作为用户名，例如整数，UUID标识符，或者让用户在首次登录平台时创建其用户名。 参考： Share authentication cookies among ASP.NET apps | Microsoft Learn </description></item><item><title>文章：使用 SCIM 配置用户</title><link>https://limyee.com/helps/a/developer-documentation/DD918/scim</link><pubDate>Wed, 09 Sep 2026 01:47:00 GMT</pubDate><guid isPermaLink="false">ce2a2671-8a8a-4f4b-bf55-68c8b1789e45:a2a1b127-8618-4c6e-8e7d-32217b78093c</guid><dc:creator>系统管理员</dc:creator><description> SCIM 2.0 是一种服务机制，允许用户从第三方 SCIM 客户端推送或配置到 SCIM 服务提供商（即您的网站）中。在大多数情况下，该第三方 SCIM 客户端充当用户管理的权威机构，而网站本身通常禁用用户注册功能。此外，它还设计用于与单点登录（Single Sign-On）结合使用，通过 OpenID Connect 实现身份验证，此时身份提供方同时提供 SCIM 和 OpenID Connect 服务。请注意，SCIM 支持将用户从身份提供方推送到您的网站，但不支持作为 SCIM 客户端，将用户回传至身份提供方。 兼容性与要求 此功能与支持SCIM 协议的平台或软件兼容，目前经过测试且确认支持的平台或软件： 平台： Microsoft Entra Okta Identity Platform 软件： scim2-client 功能 推送新用户 通过 SCIM 客户端配置用户，并将他作为新用户添加到您的站点中。 推送个人资料更新 在配置时，SCIM 客户端中的用户配置字段可根据 JSON 映射格式映射到自定义用户配置字段。具体请参见插件配置中的“属性映射”部分。请注意，尽管可以从用户信息中更新配置字段，但这些字段永远不会返回给客户端。 推送用户不批准（或删除） 当 SCIM 客户端发出不批准操作时，用户将在站点中被拒绝。 如果客户端支持删除操作，站点可以通过不批准用户（默认）、重新分配内容并删除，或直接删除来响应。具体操作请参见 SCIM 插件配置中的“用户删除操作”。 推送用户批准 以前不批准的用户可以重新批准。 推送组作为角色 组可以被推到你的网站作为新的站点角色。 推送组成员作为角色成员 组添加或删除成员可以在您的站点角色中更新。 导入用户 用户可以从你的网站上导入到你的SCIM客户端 导入组(角色) 现有的站点角色可以导入到您的SCIM客户端 注意:目前不支持导入会员资格 模式发现 您可以通过以下的发现 URL 了解更多有关SCIM实现的方式。 {Limyee Site Url}/scim/v2/ServiceProviderConfig - 这个URL将描述网站 SCIM 的功能 {Limyee Site Url}/scim/v2/ResourceTypes - 描述哪些资源类型是由站点和 URL 支持的额外信息。 {Limyee Site Url}/scim/v2/Schemas - 描述支持的模式，为资源类型和 URL 提供额外的信息。 添加和配置 SCIM 客户端应用程序 对于大多数系统，您必须在客户端应用程序中配置 SCIM。请参考客户端关于如何配置的文档。 配置 SCIM 插件 SCIM插件位于&amp;quot;系统管理&amp;quot; -&amp;gt; &amp;quot;扩展&amp;quot; -&amp;gt; SCIM 2.0 集成。或可以在系统管理搜索“SCIM 2.0 集成”。 选项 选项 必填 默认 描述 邮箱地址即用户名 否 X 如果SCIM客户端将用户名值设定为电子邮件地址，则应进行检查。为防止用户不愿公开的电子邮件地址信息泄露，网站中用户名不能使用电子邮件地址。电子邮件地址将通过从邮箱地址中移除“@domain.com”部分，并确保剩余部分在网站内唯一，必要时添加递增编号来生成。然而，当进行检查时，用户对应的用户名值将被返回给SCIM客户端，此时用户名设置为该电子邮件地址。 用户删除操作 是 禁用用户 如果SCIM客户端向站点发出 DELETE 请求，此值将决定站点的响应方式。您可以选择不批准用户、永久删除用户，或重新分配内容后删除。若选择重新分配，则会额外提供一个选项，用于指定新的用户，该用户默认为“Former Member”。 高级配置映射 您可以使用映射选项，在用户配置时将 SCIM 用户属性信息映射到自定义配置字段。该映射通过特定的 JSON 格式进行定义。需要注意的是，启用此功能时，SCIM 客户端仅会收到公共属性和系统字段信息。自定义配置数据会保留在站点中，但不会传递给客户端。 理解 JSON 配置对象包含以下两个属性。 [embed:6f64e35a-7275-4533-8e08-1ec69052024e:14bcf8bb-d812-439f-addb-d080dff656a3:type=json&amp;amp;text=%7B%0A++%22attributeMappings%22%3A+%5B%5D%2C%0A++%22onCreateOnly%22%3A+false%0A%7D] 选项 描述 attributeMappings 用于定义用户属性如何映射到自定义配置字段或系统字段的一组属性映射。 属性映射 映射属性有两种方式：系统字段或自定义配置文件字段。系统字段是站点中的常量字段，而配置文件字段则可根据您的站点进行特定配置。您可以映射任何简单值的字段，例如字符串，或包含简单值的数组，例如字符串列表。 字段映射包含以下字段： [embed:6f64e35a-7275-4533-8e08-1ec69052024e:732cf7ef-e00f-4468-9e91-9f2bb8eb4dc4:type=json&amp;amp;text=%7B%0A++++%22mapsTo%22%3A+%7B++%7D%2C%0A++++%22attributes%22%3A+%5B%5D%2C%0A++++%22format%22%3A+%22%22%2C%0A++++%22onCreateOnly%22%3A+false%0A%7D] 选项 描述 mapsTo 一个映射对象，用于标识您是映射到系统字段还是配置文件字段。 attributes 用于定义 mapTo 字段的属性名称或路径的一组字符串，以映射其值。当未指定格式且指定了多个属性时，这些属性将按定义的顺序用空格连接在一起。 format 定义多个属性的连接方式，或向现有属性添加额外数据。它是一个字符串，其中 {attributeId} 表示要使用的声明。 映射系统字段 当前支持的系统字段如下： displayName : 网站用户的显示名称。 在定义系统字段时，会在 mapsTo 字段中添加以下 JSON 格式： [embed:6f64e35a-7275-4533-8e08-1ec69052024e:97839564-d3ac-4fcb-8f17-71bdeefd4913:type=json&amp;amp;text=%22mapsTo%22%3A+%7B+%22systemField%22%3A+%22displayName%22+%7D] “systemField” 属性是唯一所需的内容，且必须符合上述定义的预设系统字段ID。 自定义个人资料字段 当不使用系统字段时，您可以指定自定义配置文件字段。如果该配置文件字段已存在，则其值由 OpenID Connect 提供程序管理；如果不存在，则在首次尝试写入值时自动创建。 [embed:6f64e35a-7275-4533-8e08-1ec69052024e:af518eff-8881-4b70-9bad-19e5c1858653:type=json&amp;amp;text=%22mapsTo%22%3A+%7B%22profileField%22%3A%7B%22key%22%3A+%22profilrField_key%22%2C+%22label%22%3A+%22FieldLabel%22%2C%22fieldType%22%3A+%22Plain+Text%22%2C%22searchable%22%3A+true+%7D+%7D] key : 该值用作配置字段的键。它会映射到一个已有的字段，如果不存在则创建一个新的字段。 label : 用于创建新字段时的字段标签。它决定了用户界面中该字段的显示方式。 fieldType : 配置文件字段的类型。数组字段支持“纯文本”和“逗号分隔列表”。 searchable : 定义该字段是否可在网站中进行搜索。 Attributes 属性 您可以为“mapsTo”字段指定一个或多个属性。如果未指定格式，且指定了多个属性时，其值将按在“mapsTo”字段中定义的顺序用空格连接。属性可以是简单类型、复杂类型，或简单值和复杂类型的数组。根据属性类型的不同，“attribute”属性的值也会有所变化。有关可用字段的更多信息，请参阅用户模式，以了解与您的SCIM客户端配置发送内容之间的差异。 映射一个简单类型 简单类型就是字符串或整数值，只需使用属性名即可。 映射复杂类型 复杂类型是一种以 JSON 对象形式表示的单个值。它通过主属性名，后跟一个点，再接子属性名（如main.subAttribute）来识别。 映射复杂数组类型 简单数组类型是一种包含简单值的数组。必须通过查询指定单个值。 [embed:6f64e35a-7275-4533-8e08-1ec69052024e:0af0ac9c-85df-4c06-962d-b2ea97a1e35a:type=json&amp;amp;text=%22attributes%22%3A+%5B+%7B%22attribute%22%3A+%22first_name%22+%7D%2C+%7B+%22attribute%22%3A+%22emails%2C+%22type%22%3A%22array%22%2C%22delimiter%22%3A%22%2C%22+%7D%5D] attribute : 令牌中显示的声明名称。它始终是必需的。 id : 令牌中显示的声明名称，替代 attribute。 type : 如果声明值是一个字符串数组，请指定 &amp;#39;array&amp;#39; delimiter : 仅对数组类型有效，这是用于连接数组值的分隔符。默认情况下为逗号（&amp;#39;,&amp;#39;）。 简单的单值声明。 [embed:6f64e35a-7275-4533-8e08-1ec69052024e:12b6844c-038a-4010-94a4-e09e020a012f:type=json&amp;amp;text=%7B+%22attribute%22%3A+%22first_name%22+%7D] 值为字符串数组的声明。 [embed:6f64e35a-7275-4533-8e08-1ec69052024e:a3b2da81-3954-4503-a156-db93d4c3057a:type=json&amp;amp;text=%7B+%22attribute%22%3A+%22groups%22%2C%22type%22%3A%22array%22%2C+%22delimiter%22%3A%22%2C%22%7D] 格式化 您可以使用格式属性来选择声明值的显示方式。该属性是一个静态字符串，其中包含以 {claimName} 格式化的占位符，而 claimName 是在“声明”区域中定义的名称。当指定多个声明时，此方法非常有用。系统会将声明值替换占位符的显示内容，但数组的情况除外，其显示方式将根据声明定义中的分隔符规则决定。 单值格式 [embed:6f64e35a-7275-4533-8e08-1ec69052024e:2c50c1b6-c87a-44e6-b13d-d129a91dfa64:type=json&amp;amp;text=%22format%22%3A%22My+name+is+%7Bfirst_name%7D%22] 多值格式 [embed:6f64e35a-7275-4533-8e08-1ec69052024e:ab2eec0b-23f3-48ca-adeb-427d2dc968ae:type=json&amp;amp;text=%22format%22%3A%22%7Blast_name%7D%2C+%7Bfirst_name%7D%22] scim2-client 示例 [embed:6f64e35a-7275-4533-8e08-1ec69052024e:5489ee09-dce1-4805-9d7c-3aeeda090740:type=python&amp;amp;text=import+base64%0D%0Aimport+datetime%0D%0A%0D%0Afrom+httpx+import+Client%0D%0Afrom+httpx+import+Timeout%0D%0Afrom+scim2_client.engines.httpx+import+SyncSCIMClient%0D%0Afrom+scim2_models+import+SearchRequest%0D%0Afrom+scim2_models+import+PatchOp%2C+PatchOperation%0D%0Afrom+scim2_client+import+SCIMResponseErrorObject%0D%0A%0D%0A%23+API+Token%2C+format+as+%7BapiKey%7D%3A%7Busername%7D%0D%0Aapi_token+%3D+%22s8bxe182l57t7ouugx21p%3Aadmin%22%0D%0A%0D%0Atoken_bytes+%3D+api_token.encode(%27utf-8%27)%0D%0Aencoded_bytes+%3D+base64.b64encode(token_bytes)%0D%0Abase64_token+%3D+encoded_bytes.decode(%27utf-8%27)%0D%0A%0D%0Aclient+%3D+Client(%0D%0A++++base_url%3D%22https%3A%2F%2Fyour_site%2Fscim%2Fv2%22%2C%0D%0A++++headers%3D%7B%0D%0A++++++++%22Rest-Authorization-Method%22%3A+%22API%22%2C%0D%0A++++++++%22Rest-User-Token%22%3A+%22%7Btoken%7D%22.format(token%3Dbase64_token)%0D%0A++++++++%7D%2C%0D%0A++++timeout%3DTimeout(timeout%3D60.0)%0D%0A)%0D%0Ascim+%3D+SyncSCIMClient(client)%0D%0Ascim.discover()%0D%0AUser+%3D+scim.get_resource_model(%22User%22)%0D%0A%0D%0Anew_username+%3D+%22kitty%22%0D%0Anew_user_password+%3D+%22123456%22%0D%0Anew_user_email+%3D+%22samlj%40example.com%22%0D%0Aupdate_username+%3D+%22mimi%22%0D%0A%0D%0A%23+Create+resources%0D%0Auser+%3D+User(user_name%3Dnew_username%2C+password%3Dnew_user_password%2C+emails%3D%5B%7B%22value%22%3Anew_user_email%2C%22primary%22%3A%22true%22%7D%5D)%0D%0Atry%3A%0D%0A++++scim.create(user)%0D%0Aexcept+SCIMResponseErrorObject+as+exc%3A%0D%0A++++error+%3D+exc.to_error()%0D%0A++++print(error.detail)%0D%0A%0D%0A%23+Query+resources%2C+only+support+eq(equal)+as+operator%2C+and+userName+as+field+in+filter%0D%0Aresponse+%3D+scim.query(User%2C+query_parameters%3DSearchRequest(filter%3D%27userName+eq+%22%7Busername%7D%22%27.format(username%3Dnew_username)))%0D%0Afor+user+in+response.resources%3A%0D%0A++++print(user.user_name)%0D%0A%0D%0A%23+Query+resources%0D%0Auser+%3D+scim.query(User%2C+user.id)%0D%0Aassert+user.user_name+%3D%3D+new_username%0D%0A%23+assert+user.meta.last_modified+%3D%3D+datetime.datetime(%0D%0A%23+++++2026%2C+6%2C+22%2C+1%2C+8%2C+17%2C+610000%2C+tzinfo%3Ddatetime.timezone.utc%0D%0A%23+)%0D%0A%0D%0A%0D%0A%23+Update+resources%0D%0Auser.display_name+%3D+update_username%0D%0Auser+%3D+scim.replace(user)%0D%0Aassert+user.display_name+%3D%3D+update_username%0D%0A%23+assert+user.meta.last_modified+%3D%3D+datetime.datetime(%0D%0A%23+++++2026%2C+6%2C+22%2C+1%2C+8%2C+17%2C+610000%2C+tzinfo%3Ddatetime.timezone.utc%0D%0A%23+)%0D%0A%0D%0A%23+Modify+resources%2C+the+value+must+defined+as+an+object+(array).%0D%0Apatch+%3D+PatchOp%5BUser%5D(operations%3D%5B%0D%0A++++PatchOperation(op%3DPatchOperation.Op.replace_%2C+value%3D%7B%22active%22%3A+False%7D)%0D%0A%5D)%0D%0Aresponse+%3D+scim.modify(User%2C+user.id%2C+patch)%0D%0A%0D%0A%23+Delete+resources%0D%0Ascim.delete(User%2C+user.id)] </description></item><item><title>文章：使用 OpenID Connect 配置 SSO</title><link>https://limyee.com/helps/a/developer-documentation/DD917/openid-connect-sso</link><pubDate>Wed, 09 Sep 2026 01:35:00 GMT</pubDate><guid isPermaLink="false">ce2a2671-8a8a-4f4b-bf55-68c8b1789e45:2d34967a-8e78-4126-a3be-e205d5a271b5</guid><dc:creator>系统管理员</dc:creator><description> 兼容性 此功能与其他经过 OpenID Connect 认证的平台兼容，目前经过测试且确认支持的平台： Microsoft Entra Okta Identity Platform auth0 添加并配置客户端应用 根据您使用的 OpenID Connect 服务提供商，通常需要在该服务提供商中添加并配置某种应用或整合。如需更多信息，请查阅您所使用提供商的 OpenID Connect 文档。下面是使用 auth0 配置 OpenID Connect 的指南。 注册 auth0 账号并创建 tenant 进入你的 tenant，选择 Applications -&amp;gt; Applications -&amp;gt; Create Application，输入你的应用名，选择“Regular Web Application”，创建 OIDC 应用。 设置你的网站 OpenID Connect 插件。选择刚创建的应用，点击 Settings 标签页，domain 并加上 https:// 前缀，复制到“授权服务器 URL”，Client ID 复制到“客户端 ID”，Client Secret 复制到 “客户端密钥”。 在 User Management -&amp;gt; Users 创建用户，在 User Management -&amp;gt; Roles 创建角色，必须创建一个管理员角色（例如：Supervisors），并创建一个用户属于此角色。此用户将映射到 Limyee CMS 管理员，用于管理网站。 要映射用户的角色，需要添加 Action，选择 Action -&amp;gt; Triggers -&amp;gt; Sign Up &amp;amp; Login -&amp;gt; post-login -&amp;gt; Create Action -&amp;gt; Create Custom Action，输入名称后，点击 Create 输入设置自定义声明的代码，代码中的声明名称（group）将 OpenID Connect 插件的映射设置的组（角色）声明一致。注意不要使用系统保留的关键字。 [embed:6f64e35a-7275-4533-8e08-1ec69052024e:805ed0d0-c2f3-44a6-ae39-b64ed29ed992:type=javascript&amp;amp;text=exports.onExecutePostLogin+%3D+async+(event%2C+api)+%3D%3E+%7B%0A++if+(event.authorization)+%7B%0A++++api.idToken.setCustomClaim(%27group%27%2C+event.authorization.roles)%3B%0A++++api.accessToken.setCustomClaim(%27group%27%2C+event.authorization.roles)%3B%0A++%7D%0A%7D%3B] 然后点击 Deploy 并返回 Post Login Triggers，将刚创建的 trigger 拖拽到 Strart 和 Complete 之间，然后点击 Apply。 添加以下代码到 OpenID Connect 插件的映射配置中，用于映射管理员到网站。 [embed:6f64e35a-7275-4533-8e08-1ec69052024e:b4c14fa1-03c5-41dd-856d-7fb1df0bd9b1:type=json&amp;amp;text=%7B%0A++%22roleMappings%22%3A%5B%0A++++++++%7B+%22source%22%3A%22Supervisors%22%2C%22destination%22%3A%22Administrators%22+%7D%0A++%5D%0A%7D] 回调 URL 当配置应用程序时，您需要指定相应的回调 URL。 类型 URL 描述 Redirect Uri https://{yourSiteURL}/openid/v1/login 用户通过身份验证后，授权码回调的 URL。 Logout Uri https://{yourSiteURL}/openid/v1/logout 这是用户在身份提供方会话终止后被重定向的URL。 配置 OpenID Connect 插件 您可以通过进入系统管理-&amp;gt;认证-&amp;gt;身份验证方法，然后选择“OpenID Connect 单点登录”找到 OpenID Connect 插件。建议您先配置所需的属性并保存，然后再选择“启用”选项。否则，您的网站认证流程将立即被替换，您可能需要使用应急管理登录来进一步配置该插件。 授权选项 选项 必填 默认 描述 授权服务器 是 这是 OpenID 服务提供商的基础 URL。该 URL 用于获取有关 OpenID 服务器的发现信息，包括相应的端点、JWT 令牌密钥和颁发者。 客户端 ID 是 这是由 OpenID 应用配置颁发的客户端 ID。 客户端密钥 是 这是由 OpenID 应用配置颁发的客户端密钥。 附加范围 否 openid, profile, email 如果您的应用程序有其他范围要求，可在此处以单行形式添加，每项新声明之间用空格分隔（例如：scope1 scope2）。默认情况下会请求标准的 openid、email 和 profile 范围。请求额外范围并不能保证服务提供商能够访问新的数据。 附加发现信息 否 通常情况下这并非必需，但如果您的授权服务器需要额外的查询字符串信息，您可以在此处添加，但无需使用“?”。如果该附加信息是应用程序的客户端ID，则可以使用之前设置的值，通过令牌 {ClientId} 来引用。例如：client_id={ClientId}。如果您使用的是静态信息，请确保其值已正确编码，以便用于URL。 网站选项 选项 必填 默认 描述 自动创建用户账户 否 是 当勾选此选项时，用户通过 OpenID Connect 成功认证后，若未找到匹配的站点账户，系统将自动创建。若不勾选，则会抛出错误。通常建议保持此选项勾选，除非您采用其他方式管理用户账户的创建，例如通过 SCIM 配置。 映射 选项 必填 默认 描述 唯一身份声明 是 sub 这是用户在身份平台中作为唯一标识符的声明。默认情况下，它使用 JWT 令牌中的“sub”声明，即主体信息。除非您确定有其他声明可以作为唯一标识符，否则应保持默认设置。 邮箱地址声明 是 email 此声明为用户的电子邮件地址。该地址将用作网站账户的私人邮箱，并作为网站账户的主要查找方式。在向网站提供时，该地址必须唯一。 用户名声明 是 preferred_user_name 这是用于为用户站点分配用户名的声明。当提供给站点时，该用户名必须是唯一的；如果创建账户时用户名不唯一，则会依次附加数字，直到其变得唯一为止。如果用户名是电子邮件地址，则会移除其中的“@”符号和域名，然后应用相同的唯一性逻辑。此举旨在确保用户的电子邮件地址不会被无意中或非自愿地泄露。即使您打算将电子邮件地址用作用户名，它也会被修改。 组（角色）声明 否 groups 此声明代表用户组，或网站所识别的角色。这是用于映射网站中角色成员资格所必需的。如果权限系统不支持此功能，或未以简单的名称形式呈现，则应留空。 映射配置 否 提供一个用于通过 JSON 映射站点中配置文件和角色数据的实用工具。更多详细信息请参见下面的“高级配置文件和角色映射”。 高级配置文件与角色映射 您可使用映射选项，在用户创建并登录时，将声明信息映射到自定义配置文件字段，并将角色关联至用户（如需要）。该功能采用特定的JSON格式进行定义。在决定使用此功能时，需注意以下几点重要事项。 如果使用 SCIM 用户配置管理，建议不要使用此功能，因为 SCIM 本身已设计用于处理此类功能。虽然两者可以共用，但存在潜在冲突风险。 在定义配置文件字段时，请使用唯一键。您可以映射到现有的配置文件字段，但用户输入的值可能在登录时被覆盖。 请将OpenID Connect的自定义配置文件字段集中到各自的配置文件字段组中。这样在网站用户界面添加时，可将其设为只读状态，因为配置文件字段现在由OpenID Connect提供程序管理，不应被修改。 了解JSON结构 配置对象包含以下三个属性： [embed:6f64e35a-7275-4533-8e08-1ec69052024e:9c6a1844-fc77-4941-bd54-f0a7e859322f:type=json&amp;amp;text=%7B%0A++%22claimMappings%22%3A+%5B%5D%2C%0A++%22roleMappings%22%3A%5B%5D%2C%0A++%22onCreateOnly%22%3Afalse%0A%7D] 选项 描述 claimMappings 用于定义如何将声明映射到自定义配置字段或系统字段的一组声明映射。 roleMappings 一系列角色映射，用于定义用户如何被映射到自定义角色和现有角色。 onCreateOnly 当为 true 时，仅在通过 OpenID Connect 创建账户时应用声明和角色映射，而不是在创建账户和登录时同时应用。 声明映射 （claimMappings） 有两种方式可以映射声明、系统字段或自定义配置文件字段。系统字段是您站点中的常量字段，而配置文件字段则可根据您的站点进行特定配置。您可以映射任何简单值字段，例如字符串，或包含简单值的数组，例如字符串列表。 claimMappings 包括以下字段： [embed:6f64e35a-7275-4533-8e08-1ec69052024e:cd25700e-759d-4fdd-9b73-1f757ba4fd56:type=json&amp;amp;text=%7B%0A++++%22mapsTo%22%3A+%7B++%7D%2C%0A++++%22claims%22%3A+%5B%5D%2C%0A++++%22format%22%3A+%22%22%0A%7D] 选项 描述 mapsTo 一个映射对象，用于标识您是映射到系统字段还是配置文件字段。 claims 一组字符串，用于定义 mapTo 字段的值。当未指定格式且指定了多个声明时，这些声明将按其定义的顺序用空格连接在一起。 format 定义多个声明的合并方式，或向现有声明添加额外数据。它是一个字符串，其中 {claimName} 用于指定要使用的声明。 映射系统字段 当前支持的系统字段如下： displayName : 网站用户的显示名称。 在定义系统字段时，会在 mapsTo 字段中添加以下 JSON 格式： [embed:6f64e35a-7275-4533-8e08-1ec69052024e:0dab4b12-66c7-4ff1-a65b-8220001635ca:type=json&amp;amp;text=%22mapsTo%22%3A+%7B+%22systemField%22%3A+%22displayName%22+%7D] “systemField” 属性是唯一所需的内容，且必须符合上述定义的预设系统字段ID。 自定义个人资料字段 当不使用系统字段时，您可以指定自定义配置文件字段。如果该配置文件字段已存在，则其值由 OpenID Connect 提供程序管理；如果不存在，则在首次尝试写入值时自动创建。 [embed:6f64e35a-7275-4533-8e08-1ec69052024e:07ab37f7-e42d-4a5d-9209-f3971a4208ef:type=json&amp;amp;text=%22mapsTo%22%3A+%7B%22profileField%22%3A%7B%22key%22%3A+%22profilrField_key%22%2C+%22label%22%3A+%22FieldLabel%22%2C%22fieldType%22%3A+%22Plain+Text%22%2C%22searchable%22%3A+true+%7D+%7D] key : 该值用作配置字段的键。它会映射到一个已有的字段，如果不存在则创建一个新的字段。 label : 用于创建新字段时的字段标签。它决定了用户界面中该字段的显示方式。 fieldType : 配置文件字段的类型。数组字段支持“纯文本”和“逗号分隔列表”。 searchable : 定义该字段是否可在网站中进行搜索。 声明属性 您可以为“mapsTo”字段指定一个或多个声明。当指定了多个声明时，若未指定格式，则这些值将按在“mapsTo”字段中定义的顺序用空格连接。此外，当适当指定时，声明也可以是字符串数组。 [embed:6f64e35a-7275-4533-8e08-1ec69052024e:2b9a9806-3350-491d-9033-70b2dfcf136c:type=json&amp;amp;text=%22claims%22%3A+%5B+%7B%22name%22%3A+%22first_name%22+%7D%2C+%7B+%22name%22%3A+%22emails%2C+%22type%22%3A%22array%22%2C%22delimiter%22%3A%22%2C%22+%7D%5D] name : 令牌中显示的声明名称。它始终是必需的。 type : 如果声明值是一个字符串数组，请指定 &amp;#39;array&amp;#39; delimiter : 仅对数组类型有效，这是用于连接数组值的分隔符。默认值为逗号（&amp;#39;,&amp;#39;）。 简单的单值声明。 [embed:6f64e35a-7275-4533-8e08-1ec69052024e:1c977ae8-ec5c-4a93-9beb-49a81aca4d32:type=json&amp;amp;text=%7B+%22name%22%3A+%22first_name%22+%7D] 值为字符串数组的声明。 [embed:6f64e35a-7275-4533-8e08-1ec69052024e:546407f3-b148-4eb5-8cb0-fc48ed931d99:type=json&amp;amp;text=%7B+%22name%22%3A+%22groups%22%2C%22type%22%3A%22array%22%2C+%22delimiter%22%3A%22%2C%22%7D] 格式化 您可以使用格式属性来选择声明值的显示方式。该属性是一个静态字符串，其中包含以 {claimName} 格式化的占位符，而 claimName 是在声明区域中定义的名称。当指定多个声明时，此格式非常有用。占位符将被其对应的声明值替换，但数组会根据声明定义中的分隔符方式进行显示。 单值格式 [embed:6f64e35a-7275-4533-8e08-1ec69052024e:2db3e66a-cf72-4523-beb0-6d67d37d059b:type=json&amp;amp;text=%22format%22%3A%22My+name+is+%7Bfirst_name%7D%22] 多值格式 [embed:6f64e35a-7275-4533-8e08-1ec69052024e:78097340-ee1d-4c93-8953-ac0a101de5c6:type=json&amp;amp;text=%22format%22%3A%22%7Blast_name%7D%2C+%7Bfirst_name%7D%22] 限制字段更新的时间 您可以为单个映射对象指定“ onCreateOnly ”属性。当该值为 true 时，配置文件数据仅在创建账户时应用。默认情况下此值为 false，表示数据将在创建账户和每次登录时应用。 [embed:6f64e35a-7275-4533-8e08-1ec69052024e:a809ae86-dfe3-4b12-bbc8-4d8cb5169ec5:type=json&amp;amp;text=%7B%0A++++%22mapsTo%22%3A+%7B++%7D%2C%0A++++%22claims%22%3A+%5B%5D%2C%0A++++%22format%22%3A+%22%22%2C%0A++++%22onCreateOnly%22%3Atrue%0A%7D] 角色映射 您可以在“ roleMappings ”中定义用户如何映射到特定角色，该字段是一个包含以下属性的映射对象数组 source : 这是身份提供者所呈现的角色名称。当未指定目标且该角色不存在时，将自动创建。 destination : 您的站点中角色的名称。当指定时，将把源角色的成员添加到目标角色中。如果目标角色不存在，则会创建该角色。 （可选） onCreateOnly : 如果为 true，角色仅在创建账户时应用。默认情况下此值为 false，表示角色将在创建账户和每次登录时应用。 [embed:6f64e35a-7275-4533-8e08-1ec69052024e:9ff7dbe9-d117-49ca-98ac-361d3924ebc8:type=json&amp;amp;text=%22roleMappings%22%3A%5B%0A++++++++%7B+%22source%22%3A%22siteMembershipAdmins%22%2C%22destination%22%3A%22CustomRole%22+%7D%2C%0A++++++++%7B+%22source%22%3A%22Group+2%22%2C+%22destination%22%3Anull%2C%22onCreateOnly%22%3Atrue+%7D%0A++%5D] </description></item><item><title>博客文章：Enable LDAP over SSL (LDAPS) for Microsoft Active Directory servers</title><link>https://limyee.com/b/members/posts/enable-ldap-over-ssl-ldaps-for-microsoft-active-directory-servers</link><pubDate>Sun, 26 Jul 2026 13:22:00 GMT</pubDate><guid isPermaLink="false">ce2a2671-8a8a-4f4b-bf55-68c8b1789e45:bf60324b-a4bf-4f43-b804-f6512f9418eb</guid><dc:creator>Bruce</dc:creator><description> Microsoft active directory servers will default to offer LDAP connections over unencrypted connections (boo!). The steps below will create a new self signed certificate appropriate for use with and thus enabling LDAPS for an AD server. Of course the &amp;quot;self-signed&amp;quot; portion of this guide can be swapped out with a real vendor purchased certificate if required. Steps have been tested successfully with Windows Server 2025. Requires a working OpenSSL install (ideally Linux/OSX) and (obviously) a Windows Active Directory server. Create root certificate Using OpenSSL, create new private key and root certificate. Answer country/state/org questions as suitable: $ openssl genrsa -aes256 -out ca.key 4096 $ openssl req -new -x509 -days 3650 -key ca.key -out ca.crt Hold onto the resulting ca.key and ca.crt . Import root certificate into trusted store of domain controller From the active directory server, open Manage computer certificates . Add the generated ca.crt to the certificate path Trusted Root Certification Authorities\Certificates . Done. Create client certificate We will now create a client certificate to be used for LDAPS, signed against our generated root certificate. From the active directory server: Create a new request.inf definition with the following contents - replacing ACTIVE_DIRECTORY_FQDN with the qualified domain name of your active directory server: [Version] Signature=&amp;quot;$Windows NT$&amp;quot; [NewRequest] Subject = &amp;quot;CN=ACTIVE_DIRECTORY_FQDN&amp;quot; KeySpec = 1 KeyLength = 2048 Exportable = TRUE MachineKeySet = TRUE SMIME = FALSE PrivateKeyArchive = FALSE UserProtected = FALSE UseExistingKeySet = FALSE ProviderName = &amp;quot;Microsoft RSA SChannel Cryptographic Provider&amp;quot; ProviderType = 12 RequestType = PKCS10 KeyUsage = 0xa0 [EnhancedKeyUsageExtension] OID = 1.3.6.1.5.5.7.3.1 ; Server Authentication Run the following to create a client certificate request of client.csr (note: it&amp;#39;s critical this is run from the active directory server itself to ensure correct private key -&amp;gt; certificate association): C:\&amp;gt; certreq -new request.inf client.csr Back to our OpenSSL system: Create v3ext.txt containing the following: keyUsage=digitalSignature,keyEncipherment extendedKeyUsage=serverAuth subjectKeyIdentifier=hash Create a certificate client.crt from certificate request client.csr and root certificate (with private key): $ openssl x509 -req -days 3650 -in client.csr -CA ca.crt -CAkey ca.key -extfile v3ext.txt -set_serial 01 -out client.crt Verify generated certificate: $ openssl x509 -in client.crt -text Ensure the following X509v3 extensions are all present : X509v3 Key Usage: Digital Signature, Key Encipherment X509v3 Extended Key Usage: TLS Web Server Authentication X509v3 Subject Key Identifier Accept and import certificate From the active directory server with client.crt present, run the following: C:\ &amp;gt; certreq -accept client.crt Open Manage computer certificates , the new certificate should now be present under Personal\Certificates . Ensure that: Certificate has a private key association. The &amp;quot;Intended Purposes&amp;quot; is defined as &amp;quot;Server Authentication&amp;quot;. Certificate name is the FQDN of the active directory server. Reload active directory SSL certificate Alternatively you can just reboot the server, but this method will instruct the active directory server to simply reload a suitable SSL certificate and if found, enable LDAPS: Create ldap-renewservercert.txt containing the following: dn: changetype: modify add: renewServerCertificate renewServerCertificate: 1 Run the following command: C:\ &amp;gt; ldifde -i -f ldap-renewservercert.txt Test LDAPS using ldp.exe utility From another domain controller, firstly install our generated root certificate ca.crt to the certificate path Trusted Root Certification Authorities\Certificates . Open utility: C:\ &amp;gt; ldp.exe From Connection , select Connect . Enter name of target domain controller. Enter 636 as port number (this is the LDAPS port). Click OK to confirm the connection works. You&amp;#39;re all done! Reference Enable LDAP over SSL with a third-party certification authority: https://support.microsoft.com/en-us/kb/321051 </description></item><item><title>博客：会员博客</title><link>https://limyee.com/b/members</link><pubDate>Sun, 26 Jul 2026 13:18:00 GMT</pubDate><guid isPermaLink="false">ce2a2671-8a8a-4f4b-bf55-68c8b1789e45:819e594e-e791-44e9-ac0b-d7a96b9fa123</guid><dc:creator /><description /></item><item><title>页面：版本与价格</title><link>https://limyee.com/p/editions-prices</link><pubDate>Thu, 16 Apr 2026 07:59:00 GMT</pubDate><guid isPermaLink="false">ce2a2671-8a8a-4f4b-bf55-68c8b1789e45:3afb479d-825e-4bdf-b82e-e4d4f918007d</guid><dc:creator /><description /></item><item><title>页面：关于我们</title><link>https://limyee.com/p/about</link><pubDate>Mon, 13 Apr 2026 07:31:00 GMT</pubDate><guid isPermaLink="false">ce2a2671-8a8a-4f4b-bf55-68c8b1789e45:34990c23-5604-4d7f-ad52-a8287c3ad752</guid><dc:creator /><description> 东莞市连易网络科技有限公司（简称：Limyee） Limyee 成立于 2014 年，是国内内容管理系统平台与电子商务解决方案的优秀品牌。公司专注于内容管理与电子商务软件的研发，为传统企业及平台电商提供内容管理和电子商务系统解决方案及相关增值服务。凭借对内容管理的深刻理解和丰富的实战经验，经过一年的努力，Limyee 已经满足不同行业的需求。Limyee 凭借优质的服务、创新进取的精神、专业的团队倍受客户青睐。 我 们一如继往地坚守品质，追求卓越，将同更多客户一起，探索电子商务的成功之道。 Limyee CMS 简介 Limyee CMS（ 软件著作权登记号： 2014SR176701）是一个领先的数字体验平台，将内容管理、数字营销和电子商务整合在一个统一的解决方案中。基于 .NET 构建，它提供可扩展性、安全性和集成灵活性，使其成为以客户为中心的企业级品牌的首选。 同时兼顾不同行业运营的不同需求，提供差异化创新型平台解决方案。 Limyee CMS 功能特色 Limyee CMS 具有灵活的自定义功能、有效的安全机制、良好的人性化设置、丰富的组合式促销功能、开放的系统整合性、所见即所得的可视化编辑等特色功能。 </description></item><item><title>论坛：讨论</title><link>https://limyee.com/f/forum</link><pubDate>Sun, 12 Apr 2026 09:02:00 GMT</pubDate><guid isPermaLink="false">ce2a2671-8a8a-4f4b-bf55-68c8b1789e45:98be3f56-0021-4afc-aa63-476407a6e074</guid><dc:creator /><description>如果有关 Limyee 的问题，或者需要咨询。可以在此处发贴。</description></item><item><title>文章：Show Wiki Toc REST 端点</title><link>https://limyee.com/helps/a/api-documentation/AD820/show-wiki-toc-rest</link><pubDate>Tue, 17 May 2022 02:58:00 GMT</pubDate><guid isPermaLink="false">ce2a2671-8a8a-4f4b-bf55-68c8b1789e45:63fd9bf3-a7cb-48a0-94c0-fe1e82a701fd</guid><dc:creator>系统管理员</dc:creator><description> URLs GET api/v1/wikis/{wikiid}/pages/{wikipageid}/toc.xml (or .json) SHOW the table of contents for a wiki page. GET api/v1/wikis/{wikiid}/toc.xml (or .json) SHOW the table of contents for a wiki. 请求参数 名称 类型 描述 必需 默认值 选项 WikiId int Wiki Id 是 WikiPageId int? Wiki Page Id 否 ShowHiddenPages bool? When true items with their HiddenInTableOfContents flag set to true will be included. By default they are not included in the list. 否 </description></item><item><title>文章：Wiki Toc REST 端点</title><link>https://limyee.com/helps/a/api-documentation/c/wiki-toc-rest</link><pubDate>Tue, 17 May 2022 02:57:00 GMT</pubDate><guid isPermaLink="false">ce2a2671-8a8a-4f4b-bf55-68c8b1789e45:695ae75b-5057-4e3f-9abd-4484e1c2e60d</guid><dc:creator>系统管理员</dc:creator><description> REST API 支持执行以下操作： Show Wiki Toc </description></item><item><title>文章：Update Wiki REST 端点</title><link>https://limyee.com/helps/a/api-documentation/AD818/update-wiki-rest</link><pubDate>Tue, 17 May 2022 02:56:00 GMT</pubDate><guid isPermaLink="false">ce2a2671-8a8a-4f4b-bf55-68c8b1789e45:2ea11038-97c7-4cdc-a201-27192c00ea71</guid><dc:creator>系统管理员</dc:creator><description> URLs PUT api/v1/wikis/{id}.xml (or .json) UPDATE a wiki. 请求参数 名称 类型 描述 必需 默认值 选项 Id int? Id 是 GroupId int? Group Id 否 Name string Name 否 Description string Default is an empty string. 否 Key string Key 否 Enabled bool? Default is true. 否 </description></item><item><title>文章：Show Wiki REST 端点</title><link>https://limyee.com/helps/a/api-documentation/AD817/show-wiki-rest</link><pubDate>Tue, 17 May 2022 02:54:00 GMT</pubDate><guid isPermaLink="false">ce2a2671-8a8a-4f4b-bf55-68c8b1789e45:14b776f4-73a9-4006-9fc9-7391c717c3b4</guid><dc:creator>系统管理员</dc:creator><description> URLs GET api/v1/groups/{groupid}/wikis/{id}.xml (or .json) SHOW a wiki. GET api/v1/groups/{groupid}/wikis/{key}.xml (or .json) SHOW a wiki. GET api/v1/wikis/{applicationid}.xml (or .json) SHOW a wiki. GET api/v1/wikis/{id}.xml (or .json) SHOW a wiki. 请求参数 名称 类型 描述 必需 默认值 选项 Id int? Either (Id or ApplicationId) or Key + GroupId are required. 否 ApplicationId Guid? Either (Id or ApplicationId) or Key + GroupId are required. 否 Key string Either (Id or ApplicationId) or Key + GroupId are required. 否 GroupId int? Either (Id or ApplicationId) or Key + GroupId are required. 否 </description></item><item><title>文章：List Wiki REST 端点</title><link>https://limyee.com/helps/a/api-documentation/AD816/list-wiki-rest</link><pubDate>Tue, 17 May 2022 02:07:00 GMT</pubDate><guid isPermaLink="false">ce2a2671-8a8a-4f4b-bf55-68c8b1789e45:2036f145-2863-4e9e-b542-850c39451320</guid><dc:creator>系统管理员</dc:creator><description> URLs GET api/v1/groups/{groupid}/wikis.xml (or .json) LIST wikis. GET api/v1/wikis.xml (or .json) LIST wikis. 请求参数 名称 类型 描述 必需 默认值 选项 GroupId int? Group Id 否 IncludeSubGroups bool? Only used when GroupId is specified. Default is false. 否 ApplicationIds string Comma separated list of ApplicationIds. Used to limit to a specific set of wikis as well as sort order if SoryBy is set to ApplicationIdsOrder 否 IncludeDisabled bool? Only return wikis that are enabled. Default is true. 否 PermissionId string Used to get a list of blogs for which the user set in UserId has the provided Permission ID. 否 SortBy string Options: Date, Score:SCORE_ID, ApplicationIdsOrder 否 UserId int? User ID of the user to check permissions for. This option is only used whenever the PermissionId is also supplied. 否 PageSize int? Specify the number of results to return per page. If not set the default is 20. The max is 100. 否 PageIndex int? Specify the page number of paged results to return. Zero-based index. If not specified the default is 0. 否 </description></item><item><title>文章：Delete Wiki REST 端点</title><link>https://limyee.com/helps/a/api-documentation/AD815/delete-wiki-rest</link><pubDate>Tue, 17 May 2022 02:06:00 GMT</pubDate><guid isPermaLink="false">ce2a2671-8a8a-4f4b-bf55-68c8b1789e45:85f12289-13c0-4493-b9f1-f97ee4b207c2</guid><dc:creator>系统管理员</dc:creator><description> URLs DELETE api/v1/wikis/{id}.xml (or .json) DELETE a wiki. 请求参数 名称 类型 描述 必需 默认值 选项 Id int? Id 是 </description></item><item><title>文章：Create Wiki REST 端点</title><link>https://limyee.com/helps/a/api-documentation/AD814/create-wiki-rest</link><pubDate>Tue, 17 May 2022 02:05:00 GMT</pubDate><guid isPermaLink="false">ce2a2671-8a8a-4f4b-bf55-68c8b1789e45:a680b4cd-4db6-4a91-8c66-593cdade44c0</guid><dc:creator>系统管理员</dc:creator><description> URLs POST api/v1/wikis.xml (or .json) CREATE a new wiki. 请求参数 名称 类型 描述 必需 默认值 选项 GroupId int? Group Id 是 Name string Name 是 Key string If not specified, the key will be generated. 否 Description string Default is an empty string. 否 Enabled bool? Default is true. 否 </description></item><item><title>文章：Wiki REST 端点</title><link>https://limyee.com/helps/a/api-documentation/c/wiki-rest</link><pubDate>Tue, 17 May 2022 02:04:00 GMT</pubDate><guid isPermaLink="false">ce2a2671-8a8a-4f4b-bf55-68c8b1789e45:4fa5b44d-619f-41df-b57d-f59f99224420</guid><dc:creator>系统管理员</dc:creator><description> REST API 支持执行以下操作： Create Wiki Delete Wiki List Wiki Show Wiki Update Wiki </description></item><item><title>文章：Update Wiki Page Subscription REST 端点</title><link>https://limyee.com/helps/a/api-documentation/AD812/update-wiki-page-subscription-rest</link><pubDate>Tue, 17 May 2022 01:59:00 GMT</pubDate><guid isPermaLink="false">ce2a2671-8a8a-4f4b-bf55-68c8b1789e45:06facd31-1399-4471-af61-f54debf7801e</guid><dc:creator>系统管理员</dc:creator><description> URLs PUT api/v1/wikis/{wikiid}/pages/{wikipageid}/subscriptions.xml (or .json) UPDATE a wiki page subscription. 请求参数 名称 类型 描述 必需 默认值 选项 WikiId int? Wiki Id 否 WikiPageId int Wiki Page Id 是 IsSubscribed bool Is Subscribed 是 </description></item><item><title>文章：Show Wiki Page Subscription REST 端点</title><link>https://limyee.com/helps/a/api-documentation/AD811/show-wiki-page-subscription-rest</link><pubDate>Tue, 17 May 2022 01:58:00 GMT</pubDate><guid isPermaLink="false">ce2a2671-8a8a-4f4b-bf55-68c8b1789e45:84fccd16-d5a7-4c5e-b60b-348823db8998</guid><dc:creator>系统管理员</dc:creator><description> URLs GET api/v1/wikis/{wikiid}/pages/{wikipageid}/subscriptions.xml (or .json) SHOW a wiki page subscription. 请求参数 名称 类型 描述 必需 默认值 选项 WikiId int? Wiki Id 否 WikiPageId int Wiki Page Id 是 </description></item><item><title>文章：Wiki Page Subscription REST 端点</title><link>https://limyee.com/helps/a/api-documentation/c/wiki-page-subscription-rest</link><pubDate>Tue, 17 May 2022 01:57:00 GMT</pubDate><guid isPermaLink="false">ce2a2671-8a8a-4f4b-bf55-68c8b1789e45:a71f9dee-c064-4903-a144-8b4910154f4b</guid><dc:creator>系统管理员</dc:creator><description> REST API 支持执行以下操作： Create Wiki Page Subscription Show Wiki Page Subscription Update Wiki Page Subscription </description></item></channel></rss>