请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

@Martin.Zhang
超级版主   /  发表于:2022-6-23 12:18  /   查看:1389  /  回复:0
本帖最后由 Bella.Yuan 于 2023-1-5 17:53 编辑

在身份集成中,我们会用到自定义安全程序的开发,在教程中有

一.配置自定义安全提供程序

二.编写自定义安全提供程序



在编写安全程序中,我们需要注意的几个方法

1. MySecurityProvider.cs 文件中的 GenerateTokenAsync 方法,此方法用于第一次登录中,验证登录信息的方法。所以这一步需要完成的功能就是验证用户名密码,案例中所给的验证方式为从数据库中直接获取用户信息后判断登录。这里可以实现自定义的验证方式。只需要对此方法中的 Database.GetUserInfo 这个被调用的方法进行改造即可。

(图例1)【链接数据库进行验证】

image.png681531066.png

  1. public Task<string> GenerateTokenAsync(string username, string password, object customizedParam = null)
  2.         {
  3.             string rst = null;
  4.             try
  5.             {
  6.                 var userInfo = Database.GetUserInfo(username, password);
  7.                 var roles = userInfo.RoleNames.Split(',');
  8.                 var tokenValues = new string[roles.Length + 1];
  9.                 tokenValues[0] = userInfo.UserName;
  10.                 roles.CopyTo(tokenValues, 1);
  11.                 var token = string.Join(Constants.TokenDelimiter, tokenValues);
  12.                 token = Convert.ToBase64String(Encoding.UTF8.GetBytes(token));

  13.                 rst = token;

  14.                 Database.WriteLogS("GenerateTokenAsync token=", token);
  15.                 return Task.FromResult(rst);
  16.             }
  17.             catch (Exception e)
  18.             {
  19.                 Database.WriteLogS("GenerateTokenAsync", e.ToString());
  20.                 return null;
  21.             }

  22.         }
复制代码

(图例2)【自定义验证,这里可以使用api,可以使用加密字符串等各类操作】

image.png113930663.png

  1. public Task<string> GenerateTokenAsync(string username, string password, object customizedParam = null)
  2.         {
  3.             string rst = null;
  4.             try
  5.             {
  6.                 if (customizedParam==null)
  7.                 {
  8.                     return null;
  9.                 }
  10.                 Dictionary<string, string> parameters = (Dictionary<string, string>)customizedParam;
  11.                 var userInfo = RSAHelper.UserDecrypt(username, parameters["key"], keyFileName);
  12.                 if (userInfo == null)
  13.                 {
  14.                     return null;
  15.                 }
  16.                 var roles = userInfo.RoleNames.Split(',');
  17.                 var tokenValues = new string[roles.Length + 1];
  18.                 tokenValues[0] = userInfo.UserName;
  19.                 roles.CopyTo(tokenValues, 1);
  20.                 var token = string.Join(Constants.TokenDelimiter, tokenValues);
  21.                 token = Convert.ToBase64String(Encoding.UTF8.GetBytes(token));

  22.                 rst = token;

  23.                 Database.WriteLogS("GenerateTokenAsync token=", token);
  24.                 return Task.FromResult(rst);
  25.             }
  26.             catch (Exception e)
  27.             {
  28.                 Database.WriteLogS("GenerateTokenAsync", e.ToString());
  29.                 return null;
  30.             }

  31.         }
复制代码

上图方法中,我们使用了自定义参数 其中key为我们自定义的键值对内容,

image.png765189208.png

在使用时可以这样配置:(自定义参数部分必须以 key:value 配置)

image.png71331175.png

2. MySecurityProvider.cs 文件中的 GetUserContextAsync 方法,根据方法追踪,最终所调用的方法为 Database.cs中的GetUserInfoByName 方法,所以过程忽略,直接改造此方法即可。

注意:这里所返回的用户信息,则直接会在wyn中登录后所用到,所以这里注意返回结果信息。

(图例3)【根据用户名获取用户相关信息】

image.png933955688.png

(图例4)【自定义返回信息】

image.png681500854.png


3. 若在程序中引用了其他dll,则需要在放入安全自定义程序时,将对应的dll放置到指定文件夹中。

路径为此(默认安装路径,若更改安装路径,则自行寻找)

C:\Program Files\Wyn\Server\SecurityProviders


4. 日志打印,需要设置路径,在C盘创建log文件夹,否则打印不到。

image.png591377257.png


5. 配置界面信息设置

image.png358500060.png

在当前页面看到的链接字符被修改为 秘钥(Base64) 这个可以在程序中直接配置,可以在 MySecurityProviderFactory.cs 文件中直接配置 SupportedSettings 此方法内容即可。

image.png426115416.png

获取时在:MySecurityProvider.cs 自定义获取即可。

image.png76860045.png


6. 设置门户网站

image.png128644103.png


7. 返回的组织,角色如何处理?

返回信息中,若组织,角色在系统中没有,则无法正常访问,可以在后台管理中设置对应的组织,角色,并且给角色分配响应的权限。

设置组织:

image.png609383849.png

传递的组织内容为:"/A/B" 顶级组织信息为 "/"

角色配置:给对应的角色设置权限

image.png455330809.png


8. 进程调试 ctrl+alt+p,选择 显示用户所有进程,选中dotnet.exe 打中断点。点击附加。程序中选择断点。

image.png557509154.png

接下来就是打包测试了,将程序配置好之后,就可以正常测试使用了。


登录API客户端管理

登录api代码示例


通过postman调用生成token ,生成对应的安全自定义程序。

请求参数中:client_id,client_secret 为 Client Management 中所生成内容. 具内容参考 登录API客户端管理 默认信息有:

client_id:integration

client_secret:eunGKas3Pqd6FMwx9eUpdS7xmz

后期可以自行设置修改。

请求截图:

image.png694854736.png

image.png647239989.png

②代码请求如下:


  1. fetch("http://localhost:51980/connect/token", {
  2. "method": "POST",
  3. "headers": {
  4. "Content-type": "application/x-www-form-urlencoded"
  5. },
  6. "body": "grant_type=password&username=admin&password=admin&client_id=integration&client_secret=eunGKas3Pqd6FMwx9eUpdS7xmz"
  7. }).then(function(res){
  8. res.json()
  9. .then(function(data){
  10. console.log(data)
  11. });
  12. })
复制代码


至此,已经可以获取到token了,获取后可以直接登录访问。

http://localhost:51980/integration?token=生成的token

image.png285476683.png


还有啥不懂的,直接帖子后面回复。






0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部