BI如何实现用户身份集成自定义安全程序开发


统一身份认证是整个 IT 架构的最基本的组成部分,而账号则是实现统一身份认证的基础。做好账号的规划和设计直接决定着企业整个信息系统建设的便利与难易程度,决定着系统能否足够敏捷和快速赋能,也决定了在数字化转型中的投入和效率。用户账号是用户身份的一种表示,传统统一身份认证系统往往被作为外围系统来集成各个应用系统,而不是作为核心基础系统被其他应用系统来集成。所以传统统一身份认证系统的建设存在众多的问题,使设计实现复杂化、管理复杂化、集成复杂化。
每个企业可能同时会有多套系统在运行,但每个用户的账号在企业中仅有一套,可以适用于各个系统当中。因此,这就涉及到我们如何将一套账号应用到各个系统中,保证账号的权限体系。
常见方法:
1、(最简单但最深恶痛绝的)数据复制一份导入到每一套系统中。这样会造成维护工作量大,数据混乱,如果是多级企业,将会发生难以想象的灾难。
2、在身份集成中,自定义安全程序的开发,用一套用户身份验证程序,集成到各个系统中。
本文将从以下三点来介绍如何编写自定义安全提供程序,并在项目中配置引用。

  • 编写自定义安全提供程序
  • 配置自定义安全提供程序
  • 注意事项
编写自定义安全提供程序

编写一个自定义安全提供程序的步骤如下:
(1) 创建项目

使用Microsoft Visual Studio 2017(以下简称VS2017),创建一个新的项目,类型选为 Visual C# - .NET Standard - 类库(.NET Standard),输入项目名称,如:MySecurityProvider:

(2) 添加程序包依赖
自定义安全提供程序所实现的接口是由几个程序包定义的,为此需要添加对这几个程序包的依赖。方法如下:
首先将下面这两个文件下载保存到本地硬盘,比如C:\Temp\pkg 文件夹下:
grapecity.enterprise.identity.externalidentityprovider.1.0.2.nupkg

GrapeCity.Enterprise.Identity.SecurityProvider.1.0.3.nupkg

单击VS2017的“工具”菜单的“NuGet包管理器”>“程序包管理器设置”:

选中“程序包源”,再单击加号按钮:

单击【...】按钮,指定“源”的路径为nupkg文件所在的文件夹,如:C:\temp\pkg

单击“确定”按钮保存设置。
在右侧解决方案资源管理器窗格中,右键单击“依赖项”,点击“管理NuGet程序包”,再点击“浏览”,选中新添加的程序包源,将会列出两个需要依赖的程序包:

GrapeCity.Enterprise.Identity.ExternalIdentityProvider和GrapeCity.Enterprise.Identity.SecurityProvider,如下图:

逐个选中程序包,点击“安装”,即可添加本项目对这两个程序包的依赖。
(3) 实现接口
自定义安全提供程序需要实现两个接口:ISecurityProviderFactory和ISecurityProvider。
实现第一个接口的操作步骤:
添加一个新的类文件,如MySecurityProviderFactory.cs,以实现ISecurityProviderFactory接口。
public class MySecurityProviderFactory: ISecurityProviderFactory
该接口规定了两个属性和一个方法:

public string Description // 本安全提供程序的描述字串。
public IEnumerable SupportedSettings // 本安全提供程序支持的用户配置项。

这些用户配置项将出现在Wyn的管理画面中,允许系统管理员进行设置。典型的配置项是用户信息数据库的连接字串。通过提供这种配置项目,可以避免在安全提供程序中硬编码用户信息数据库连接字串的问题。
public Task CreateAsync(IEnumerable settings) // 本安全提供程序的实例创建方法。
这个方法的内容几乎是固定的,如:

public Task CreateAsync(IEnumerable settings)
{
    return Task.FromResult(new MySecurityProvider(settings));
}

实现ISecurityProvider接口

这个ISecurityProvider接口是安全提供程序的核心,其规定的属性和方法如下:

成员类型 名称 说明
属性 ProviderName 返回本安全提供程序的名称。
方法 GenerateTokenAsync 验证用户名和密码,通过时生成Wyn的访问令牌。
方法 GetUserContextAsync 返回用户的上下文信息,一般是根据用户名,从数据库查询得到用户的所属部门和其他业务数据。
方法 GetUserDescriptorAsync 返回用户的说明信息,该信息将用于门户页面的当前登录用户显示。
方法 GetUserOrganizationsAsync 返回用户的所属组织结构信息。
方法 GetUserRolesAsync 返回用户的角色信息,多个角色以字符串数组的形式返回。
方法 ValidateTokenAsync 验证令牌的合法性。在业务系统集成中,使用Token直接访问系统时,此方法用于检查传入Token的正确性。

除了上表所列成员,还有IExternalUserDescriptor,IExternalUserContext等接口,这些接口只是规定了实体类的属性,使用自定义类实现这些接口即可。

下面的文件附件是一个自定义安全提供程序的示例代码。

MySecurityProvider.zip

此示例代码中的解决方案(.sln)可在Visual Studio 2017中直接打开。示例代码文件夹\bin\debug中也包含Build产物DLL,可直接配置为Wyn的安全提供程序。示例的用户信息是保存在SQL Server数据库中的,请将本文件包中的db\MyUsers.bak文件恢复为SQL Server数据库。

有关接口的详细说明,请参考下面的接口介绍。

接口介绍

ISecurityProviderFactory接口

定义

public interface ISecurityProviderFactory 
{
    string ProviderName { get; }
    string Description { get; }
    IEnumerable SupportedSettings { get; }
    Task CreateAsync(IEnumerable settings);
}

接口说明

属性和方法 说明
ProviderName 安全提供程序的名称,不能为空,不能和其它的安全提供程序重名。
Description 安全提供程序的描述文本,可以为空。
SupportedSettings 该安全提供程序加载和运行时所必须的配置项。比如安全提供程序需要访问数据库,那么数据库连接字符串即为一个必须的配置项,必须由管理员在安全提供程序管理页面配置好,该安全提供程序才能正常工作。可以没有任何必须的配置项,返回一个空列表即可。
CreateAsync 创建一个安全提供程序的实例。参数settings即为管理员已经配置好的配置项列表,用户可以在这里把配置项列表通过构造函数传入构建的安全提供程序实例。

登录API客户端管理
登录api代码示例

通过postman调用生成token ,生成对应的安全自定义程序。
请求参数中:client_id,client_secret 为 Client Management 中所生成内容. 具内容参考 登录API客户端管理 默认信息有:
client_id:integration
client_secret:eunGKas3Pqd6FMwx9eUpdS7xmz
后期可以自行设置修改。
请求截图:

②代码请求如下:

fetch("http://localhost:51980/connect/token", {
"method": "POST",
"headers": {
"Content-type": "application/x-www-form-urlencoded"
},
"body": "grant_type=password&username=admin&password=admin&client_id=integration&client_secret=eunGKas3Pqd6FMwx9eUpdS7xmz"
}).then(function(res){
res.json()
.then(function(data){
console.log(data)
});
})


至此,已经可以获取到token了,获取后可以直接登录访问。
http://localhost:51980/integration?token=生成的token

到这里已经全部实现用户身份集成自定义开发,大家如果想了解更多商业BI行业精选模板,可以访问:
https://www.grapecity.com.cn/solutions/wyn/demo