【嵌入式集成-集成配置】用户身份集成自定义安全程序开发
本帖最后由 lucas.Yan 于 2024-5-16 09:22 编辑在身份集成中,我们会用到自定义安全程序的开发,在教程中有
一.配置自定义安全提供程序
二.编写自定义安全提供程序
在编写安全程序中,我们需要注意的几个方法
1. MySecurityProvider.cs 文件中的 GenerateTokenAsync 方法,此方法用于第一次登录中,验证登录信息的方法。所以这一步需要完成的功能就是验证用户名密码,案例中所给的验证方式为从数据库中直接获取用户信息后判断登录。这里可以实现自定义的验证方式。只需要对此方法中的 Database.GetUserInfo 这个被调用的方法进行改造即可。(图例1)【链接数据库进行验证】public Task<string> GenerateTokenAsync(string username, string password, object customizedParam = null)
{
string rst = null;
try
{
var userInfo = Database.GetUserInfo(username, password);
var roles = userInfo.RoleNames.Split(',');
var tokenValues = new string;
tokenValues = userInfo.UserName;
roles.CopyTo(tokenValues, 1);
var token = string.Join(Constants.TokenDelimiter, tokenValues);
token = Convert.ToBase64String(Encoding.UTF8.GetBytes(token));
rst = token;
Database.WriteLogS("GenerateTokenAsync token=", token);
return Task.FromResult(rst);
}
catch (Exception e)
{
Database.WriteLogS("GenerateTokenAsync", e.ToString());
return null;
}
}
(图例2)【自定义验证,这里可以使用api,可以使用加密字符串等各类操作】public Task<string> GenerateTokenAsync(string username, string password, object customizedParam = null)
{
string rst = null;
try
{
if (customizedParam==null)
{
return null;
}
Dictionary<string, string> parameters = (Dictionary<string, string>)customizedParam;
var userInfo = RSAHelper.UserDecrypt(username, parameters["key"], keyFileName);
if (userInfo == null)
{
return null;
}
var roles = userInfo.RoleNames.Split(',');
var tokenValues = new string;
tokenValues = userInfo.UserName;
roles.CopyTo(tokenValues, 1);
var token = string.Join(Constants.TokenDelimiter, tokenValues);
token = Convert.ToBase64String(Encoding.UTF8.GetBytes(token));
rst = token;
Database.WriteLogS("GenerateTokenAsync token=", token);
return Task.FromResult(rst);
}
catch (Exception e)
{
Database.WriteLogS("GenerateTokenAsync", e.ToString());
return null;
}
}
上图方法中,我们使用了自定义参数 其中key为我们自定义的键值对内容,在使用时可以这样配置:(自定义参数部分必须以 key:value 配置)2. MySecurityProvider.cs 文件中的 GetUserContextAsync 方法,根据方法追踪,最终所调用的方法为 Database.cs中的GetUserInfoByName 方法,所以过程忽略,直接改造此方法即可。注意:这里所返回的用户信息,则直接会在wyn中登录后所用到,所以这里注意返回结果信息。(图例3)【根据用户名获取用户相关信息】(图例4)【自定义返回信息】
3. 若在程序中引用了其他dll,则需要在放入安全自定义程序时,将对应的dll放置到指定文件夹中。路径为此(默认安装路径,若更改安装路径,则自行寻找)C:\Program Files\Wyn\Server\SecurityProviders
4. 日志打印,需要设置路径,在C盘创建log文件夹,否则打印不到。
5. 配置界面信息设置在当前页面看到的链接字符被修改为 秘钥(Base64) 这个可以在程序中直接配置,可以在 MySecurityProviderFactory.cs 文件中直接配置 SupportedSettings 此方法内容即可。 获取时在:MySecurityProvider.cs 自定义获取即可。
6. 设置门户网站
7. 返回的组织,角色如何处理?返回信息中,若组织,角色在系统中没有,则无法正常访问,可以在后台管理中设置对应的组织,角色,并且给角色分配响应的权限。设置组织:传递的组织内容为:"/A/B" 顶级组织信息为 "/"角色配置:给对应的角色设置权限
8. 进程调试 ctrl+alt+p,选择 显示用户所有进程,选中dotnet.exe 打中断点。点击附加。程序中选择断点。接下来就是打包测试了,将程序配置好之后,就可以正常测试使用了。
登录API客户端管理登录api代码示例
通过postman调用生成token ,生成对应的安全自定义程序。请求参数中:client_id,client_secret 为 Client Management 中所生成内容. 具内容参考 登录API客户端管理 默认信息有:client_id:integrationclient_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
还有啥不懂的,直接帖子后面回复。
页:
[1]