79 lines
3.0 KiB
C#
79 lines
3.0 KiB
C#
|
|
|
|||
|
|
using System.Net;
|
|||
|
|
using System.Text;
|
|||
|
|
using System.Windows;
|
|||
|
|
|
|||
|
|
using Flurl.Http;
|
|||
|
|
|
|||
|
|
using Newtonsoft.Json;
|
|||
|
|
|
|||
|
|
using Szmedi.AIScriptRunner.Properties;
|
|||
|
|
using Szmedi.AIScriptRunner.Web;
|
|||
|
|
|
|||
|
|
namespace Szmedi.AIScriptRunner.Services
|
|||
|
|
{
|
|||
|
|
public class AuthenticationService
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
private string GetStreamReader(string url, string postData, string auth = "", int timeout = 60000, string encode = "utf-8", string contentType = "application/json", string method = "POST")
|
|||
|
|
{
|
|||
|
|
var data = Encoding.GetEncoding(encode).GetBytes(postData);
|
|||
|
|
var webRequest = (HttpWebRequest)WebRequest.Create(url);
|
|||
|
|
|
|||
|
|
if (!string.IsNullOrWhiteSpace(auth))
|
|||
|
|
{
|
|||
|
|
var athu = "Authorization:" + auth;
|
|||
|
|
var whc = new WebHeaderCollection();
|
|||
|
|
whc.Add(athu);
|
|||
|
|
webRequest.Headers.Add(whc);
|
|||
|
|
}
|
|||
|
|
webRequest.Method = method;
|
|||
|
|
webRequest.ContentType = contentType + ";" + encode;
|
|||
|
|
webRequest.ContentLength = data.Length;
|
|||
|
|
webRequest.Timeout = timeout;
|
|||
|
|
var requestStream = webRequest.GetRequestStream();
|
|||
|
|
requestStream.Write(data, 0, data.Length);
|
|||
|
|
var webResponse = (HttpWebResponse)webRequest.GetResponse();
|
|||
|
|
var responseStream = webResponse.GetResponseStream();
|
|||
|
|
if (responseStream == null) { return string.Empty; }
|
|||
|
|
var streamReader = new StreamReader(responseStream, Encoding.GetEncoding(encode));
|
|||
|
|
return streamReader.ReadToEnd();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public async Task<ResponseVO> LoginAsync(string username, string password)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
// 1. 取公钥
|
|||
|
|
var keyJson = await Settings.Default.PublicKeyUrl.GetStringAsync();
|
|||
|
|
var pubKeyVO = JsonConvert.DeserializeObject<PublicKeyVO>(keyJson);
|
|||
|
|
if (pubKeyVO?.Successful == true)
|
|||
|
|
{
|
|||
|
|
// 2. 用 BouncyCastle 加密
|
|||
|
|
var encrypted = RSAHelper.EncryptByJavaKey(pubKeyVO.Data.PublicKey, $"{password}");
|
|||
|
|
|
|||
|
|
var jsonData = $"{{\"accountName\":\"{username}\",\"password\":\"{encrypted}\",\"uuid\":\"{pubKeyVO.Data.UUID}\",\"appVersion\":\"newversion\"}}";
|
|||
|
|
// 3. 发送登录请求
|
|||
|
|
var respones = GetStreamReader(Settings.Default.LoginUrl, jsonData);
|
|||
|
|
var settings = new JsonSerializerSettings
|
|||
|
|
{
|
|||
|
|
MissingMemberHandling = MissingMemberHandling.Ignore
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
return JsonConvert.DeserializeObject<ResponseVO>(respones, settings);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
MessageBox.Show("获取不到用户公钥信息,请联系管理员");
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
MessageBox.Show(ex.Message);
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|