Files
CNCEC_SUBQHSE_WUHUAN/SGGL/FineUIPro.Web/HSSE/Hazard/ToHazard.aspx.cs
T
2026-05-31 14:58:26 +08:00

131 lines
4.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace FineUIPro.Web.HSSE.Hazard
{
public partial class ToHazard : PageBase
{
public string url
{
get
{
return (string)ViewState["url"];
}
set
{
ViewState["url"] = value;
}
}
protected void Page_Load(object sender, EventArgs e)
{
url = BuildRedirectUrl(CurrUser.Account);
}// 密钥(与Java完全一致)
private const string SECRET_B64 = "y3KXl9sle7+WUpwyVajCyx8LyQdZSwUUgVS69FDvuR8=";
// 登录接口地址
private const string API_LOGIN = "https://hse-ai.cwcec.com/api/auth/unified-login";
/// <summary>
/// 构建统一登录跳转URL(C#版,与Java逻辑完全一致)
/// </summary>
/// <param name="username">用户名</param>
/// <returns>加密签名字符串</returns>
public static string BuildRedirectUrl(string username)
{
// 1. Base64 解码密钥
byte[] key = Convert.FromBase64String(SECRET_B64);
// 2. 生成时间戳(秒)、随机nonce
long ts = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
string nonce = Guid.NewGuid().ToString("N"); // 去掉横杠,与Java一致
// 3. 构建JSON明文
string json = $"{{\"username\":\"{username}\",\"timestamp\":{ts},\"nonce\":\"{nonce}\"}}";
// 4. AES-CBC-PKCS7 加密(Hutool默认:随机IV,输出 = IV + 密文)
string data = AesCbcEncrypt(json, key);
// 5. 构建签名原文 + HMACSHA256 签名
string signPayload = $"data={data}&timestamp={ts}&nonce={nonce}";
string sign = HmacSha256Sign(signPayload, key);
// 6. 构建有序参数(LinkedHashMap 对应 SortedDictionary / 手动有序)
var queryParams = new Dictionary<string, string>
{
{ "data", data },
{ "timestamp", ts.ToString() },
{ "nonce", nonce },
{ "sign", sign }
};
// 7. 拼接URLURL编码)
StringBuilder sb = new StringBuilder(API_LOGIN).Append('?');
foreach (var kvp in queryParams)
{
sb.Append(HttpUtility.UrlEncode(kvp.Key))
.Append('=')
.Append(HttpUtility.UrlEncode(kvp.Value))
.Append('&');
}
// 去掉最后一个 &
if (sb.Length > 0) sb.Length--;
return sb.ToString();
}
#region Java Hutool完全对齐
/// <summary>
/// AES-CBC-PKCS7 加密
/// 输出格式:IV(16字节) + 密文 → Base64(和Hutool AES.encrypt 行为一致)
/// </summary>
private static string AesCbcEncrypt(string plainText, byte[] key)
{
using (Aes aes = Aes.Create())
{
aes.Key = key;
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7; // 与Java PKCS5Padding 通用兼容
aes.GenerateIV(); // 自动生成随机16字节IV(和Java一致)
using (var encryptor = aes.CreateEncryptor(aes.Key, aes.IV))
using (var ms = new System.IO.MemoryStream())
{
// 先写入IVHutool默认格式:IV + 密文)
ms.Write(aes.IV, 0, aes.IV.Length);
using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
using (var sw = new System.IO.StreamWriter(cs, Encoding.UTF8))
{
sw.Write(plainText);
}
// 输出:IV + 密文 → Base64
return Convert.ToBase64String(ms.ToArray());
}
}
}
/// <summary>
/// HMACSHA256 签名(小写十六进制)
/// </summary>
private static string HmacSha256Sign(string payload, byte[] key)
{
using (var hmac = new HMACSHA256(key))
{
byte[] payloadBytes = Encoding.UTF8.GetBytes(payload);
byte[] hashBytes = hmac.ComputeHash(payloadBytes);
// 转小写十六进制(与Java digestHex一致)
return BitConverter.ToString(hashBytes).Replace("-", "").ToLower();
}
}
#endregion
}
}