背景
因业务需求,需要与第三方进行融合登录。第三方融合登录接口有关于验签的要求,将解密的数据按照规定的顺序进行MD5
进行签名验证并与提供的MD5
签名作为对比。其加密的明文是Json
字符串,解密后还原后要按照URl参数的形式进行排列进行MD5
签名。
规定
加密参数(注:加密参数名称均为小写字母,没有使用驼峰法命名)
名称 | 类型 | 默认值 | 简介 |
sourceid | String | 必传 | 来源标识 |
targetid | String | 必传 | 目标标识 |
usercode | String | 必传 | 用户唯一标识 |
username | String | 用户姓名 | |
idcard | String | 身份证号码 | |
phone | String | 手机号码 | |
ouname | String | 部门名称 | |
time | String | 必传 | 当前时间戳,精确到毫秒 |
签名数据采用以上面表格顺序以及以下格式进行字段拼接
sourceid=skyfinder&targetid=sky&usercode=100001&username=清风&idcard=110101199003074194&phone=16620927111&ouname=博客&time=1599539358
实现
创建一个自定义特性SortOrderAttribute
,用来标识实体属性顺序与名称。
public class SortOrderAttribute: Attribute
{
public string Name { get; set; }
public int Index { get; set; }
public SortOrderAttribute(string name,int index)
{
Name = name;
Index = index;
}
}
根据表格内容创建实体模型指定其排列顺序并通过方法GetUrIParameterString
实现顺序输出内容。
public class PoliceStudiesUser
{
/// <summary>
/// 来源标识
/// </summary>
[SortOrder("来源标识",1)]
public string sourceid { get; set; }
/// <summary>
/// 目标标识
/// </summary>
[SortOrder("来源标识", 2)]
public string targetid { get; set; }
/// <summary>
/// 用户唯一标识
/// </summary>
[SortOrder("来源标识", 3)]
public string usercode { get; set; }
/// <summary>
/// 用户姓名
/// </summary>
[SortOrder("来源标识", 4)]
public string username { get; set; }
/// <summary>
/// 身份证号码
/// </summary>
[SortOrder("来源标识", 5)]
public string idcard { get; set; }
/// <summary>
/// 手机号码
/// </summary>
[SortOrder("来源标识", 6)]
public string phone { get; set; }
/// <summary>
/// 部门名称
/// </summary>
[SortOrder("来源标识", 7)]
public string ouname { get; set; }
/// <summary>
/// 当前时间戳,精确到毫秒
/// </summary>
[SortOrder("来源标识", 8)]
public string time { get; set; }
public string GetUrIParameterString()
{
List<string> urlParameter = new List<string>();
//foreach (PropertyInfo item in this.GetType().GetProperties().OrderBy(p => (p.GetCustomAttributes(true)[0] as SortOrderAttribute).Index).ToArray())
Type type = this.GetType();
var properties = type.GetProperties().OrderBy(p => (p.GetCustomAttributes(true)[0] as SortOrderAttribute).Index).ToArray();
foreach (var item in properties)
{
string value = item.GetValue(this, null) == null ? "" : item.GetValue(this, null).ToString().Trim();
if (string.IsNullOrWhiteSpace(value))
{
continue;
}
urlParameter.Add($"{item.Name}={value}");
}
return string.Join("&",urlParameter);
}
}
调用测试
static void Main(string[] args)
{
PoliceStudiesUser studiesUser = new PoliceStudiesUser() {
sourceid="skyfinder",
targetid="sky",
idcard= "110101199003074194",
usercode="100001",
username="清风",
ouname="博客",
phone= "16620927111",
time= "1599539358"
};
Console.WriteLine(studiesUser.GetUrIParameterString());
Console.Read();
}
示例下载
NET CORE指定顺序输出对象属性内容
转载请注明:清风亦平凡 » NET CORE将对象属性按照指定顺序输出