Commit 3818b6fd by 泽锋 李

对接saas登陆

parent e7b15e4c
using System;
using System.Collections.Generic;
using System.Text;
namespace AutoTurnOver.Models
{
public class TokenResult
{
/// <summary>
/// 返回状态
/// </summary>
public bool result { get; set; }
/// <summary>
/// 返回信息
/// </summary>
public string message { get; set; }
}
public class tokenUser
{
public SaasUserInfo result { get; set; }
public int statusCode { get; set; }
}
public class SaasUserInfo
{
public bool success { get; set; }
public string Account { get; set; }
public int UserId { get; set; }
public bool AllCompany { get; set; }
public List<tokenRole> roles { get; set; }
public CompanyInfo Company { get; set; }
public DepartmentInfo Department { get; set; }
public bool has_admin { get; set; }
}
public class tokenRole
{
public int Id { get; set; }
public string RoleCode { get; set; }
public string RoleName { get; set; }
}
public class DepartmentInfo
{
public int DepartmentId { get; set; }
public string Name { get; set; }
public string Code { get; set; }
}
public class CompanyInfo
{
public int Id { get; set; }
public string CompanyCode { get; set; }
public string CompanyName { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.IO;
using System.Net;
using System.Reflection;
using System.Text;
using System.Threading;
namespace AutoTurnOver.Utility
{
public class HHttpHelper
{
private Dictionary<string, string> _heads = new Dictionary<string, string>();
public string Request(string url, RequestType type, string data = "", string host = null, string entype = null, int timeout = 0)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
if (timeout <= 0)
{
request.Timeout = 1000 * 30;
}
else
{
request.Timeout = timeout;
}
request.UserAgent =
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36";
request.Accept = "*";
foreach (var item in _heads)
{
SetHeaderValue(request.Headers, item.Key, item.Value);
}
if (!string.IsNullOrEmpty(host))
{
SetHeaderValue(request.Headers, "Host", host);
}
switch (type)
{
case RequestType.GET:
if (string.IsNullOrWhiteSpace(request.ContentType))
request.ContentType = "text/html; charset=UTF-8";
request.Method = "GET";
break;
case RequestType.POST:
{
if (string.IsNullOrWhiteSpace(entype))
request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
else
request.ContentType = entype;
request.Method = "POST";
byte[] bytes = Encoding.UTF8.GetBytes(data);
request.ContentLength = bytes.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(bytes, 0, bytes.Length);
requestStream.Close();
break;
}
default:
request.ContentType = "text/html; charset=UTF-8";
break;
}
StringBuilder builder = new StringBuilder();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);
while (reader.Peek() != -1)
{
builder.Append(reader.ReadLine());
}
responseStream.Dispose();
reader.Close();
response.Close();
Thread.Sleep(10);
return builder.ToString();
}
public string UploadFile(string url, byte[] bytes)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Timeout = 0x927c0;
request.UserAgent =
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36";
request.Accept = "*";
foreach (var item in _heads)
{
SetHeaderValue(request.Headers, item.Key, item.Value);
}
request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
request.Method = "POST";
//byte[] bytes = File2Bytes(filePath);
request.ContentLength = bytes.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(bytes, 0, bytes.Length);
requestStream.Close();
StringBuilder builder = new StringBuilder();
try
{
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);
while (reader.Peek() != -1)
{
builder.Append(reader.ReadLine());
}
responseStream.Dispose();
reader.Close();
response.Close();
Thread.Sleep(10);
}
catch (Exception ex)
{
}
return builder.ToString();
}
public string PostFile(string url, string filePath, string fileName, string access_token, string aop_signature,
string fileByteName)
{
byte[] fileContentByte = new byte[1024]; // 文件内容二进制
#region 将文件转成二进制
FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
fileContentByte = new byte[fs.Length]; // 二进制文件
fs.Read(fileContentByte, 0, Convert.ToInt32(fs.Length));
fs.Close();
#endregion
#region 定义请求体中的内容 并转成二进制
string boundary = "ceshi";
string Enter = "\r\n";
string fileContentStr = "--" + boundary + Enter
+ "Content-Type:application/octet-stream" + Enter
+ $"Content-Disposition: form-data; name=\"{fileByteName}\"; filename=\"" + fileName +
"\"" + Enter + Enter;
var fileContentStrByte = Encoding.UTF8.GetBytes(fileContentStr); //fileContent一些名称等信息的二进制(不包含文件本身)
#endregion
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "multipart/form-data;boundary=" + boundary;
Stream myRequestStream = request.GetRequestStream(); //定义请求流
#region 将各个二进制 安顺序写入请求流 modelIdStr -> (fileContentStr + fileContent) -> uodateTimeStr -> encryptStr
myRequestStream.Write(fileContentStrByte, 0, fileContentStrByte.Length);
myRequestStream.Write(fileContentByte, 0, fileContentByte.Length);
#endregion
HttpWebResponse response = null;
try
{
response = (HttpWebResponse)request.GetResponse();//发送
}
catch (WebException ex)
{
response = (HttpWebResponse)ex.Response;
}
Stream myResponseStream = response.GetResponseStream();//获取返回值
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
return retString;
}
/// <summary>
/// 将文件转换为byte数组
/// </summary>
/// <param name="path">文件地址</param>
/// <returns>转换后的byte数组</returns>
public static byte[] File2Bytes(string path)
{
if (!System.IO.File.Exists(path))
{
return new byte[0];
}
FileInfo fi = new FileInfo(path);
byte[] buff = new byte[fi.Length];
FileStream fs = fi.OpenRead();
fs.Read(buff, 0, Convert.ToInt32(fs.Length));
fs.Close();
return buff;
}
public void AddHeaderValue(string name, string value)
{
_heads.Add(name, value);
}
private void SetHeaderValue(WebHeaderCollection head, string name, string value)
{
PropertyInfo property = typeof(WebHeaderCollection).GetProperty("InnerCollection", BindingFlags.NonPublic | BindingFlags.Instance);
if (property != null)
{
NameValueCollection values = property.GetValue(head, null) as NameValueCollection;
values[name] = value;
}
}
public enum RequestType
{
GET,
POST
}
}
}
{
"version": 1,
"isRoot": true,
"tools": {
"dotnet-ef": {
"version": "3.1.2",
"commands": [
"dotnet-ef"
]
}
}
}
\ No newline at end of file
...@@ -21,32 +21,40 @@ namespace AutoTurnOver.Common ...@@ -21,32 +21,40 @@ namespace AutoTurnOver.Common
/// <returns></returns> /// <returns></returns>
public static UserData GetUser() public static UserData GetUser()
{ {
Microsoft.AspNetCore.Http.HttpContext current = HttpContext.Current; var userInfo = MyHttpContext.Current.Session.GetString("UserInfo");
try var saasUser = userInfo.ToObj<SaasUserInfo>();
{ return new UserData {
string cookie; UserName = saasUser.Account,
current.Request.Cookies.TryGetValue("BLUserAcct",out cookie); UserAccount = saasUser.Account,
var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json"); DepartmentName = saasUser.Department==null?"":saasUser.Department.Name
var configurationRoot = builder.Build(); };
string url = ConfigHelper.GetValue("WebHost_GetUser");
// string url = ConfigurationManager.AppSettings["WebHost"].ToString(); //Microsoft.AspNetCore.Http.HttpContext current = HttpContext.Current;
string userstr = HttpHelper.Request(url, RequestType.POST, "BLUserAcct=" + cookie); //try
LoginData data = JsonConvert.DeserializeObject<LoginData>(userstr); //{
if (data.code != 1) // string cookie;
{ // current.Request.Cookies.TryGetValue("BLUserAcct",out cookie);
current.Response.StatusCode = (int)HttpStatusCode.Unauthorized; // var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json");
return null; // var configurationRoot = builder.Build();
} // string url = ConfigHelper.GetValue("WebHost_GetUser");
else // // string url = ConfigurationManager.AppSettings["WebHost"].ToString();
{ // string userstr = HttpHelper.Request(url, RequestType.POST, "BLUserAcct=" + cookie);
return data.data; // LoginData data = JsonConvert.DeserializeObject<LoginData>(userstr);
} // if (data.code != 1)
} // {
catch(Exception) // current.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
{ // return null;
current.Response.StatusCode = (int)HttpStatusCode.Unauthorized; // }
return null; // else
} // {
// return data.data;
// }
//}
//catch(Exception)
//{
// current.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
// return null;
//}
} }
......
...@@ -12,6 +12,7 @@ namespace AutoTurnOver.Controllers ...@@ -12,6 +12,7 @@ namespace AutoTurnOver.Controllers
{ {
[Route("api/[controller]")] [Route("api/[controller]")]
[ApiController] [ApiController]
[NoLogin]
public class ApiController : ControllerBase public class ApiController : ControllerBase
{ {
[HttpPost("GetOutStockPage")] [HttpPost("GetOutStockPage")]
......
using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace AutoTurnOver.Models
{
public class MyHttpContext
{
private static IHttpContextAccessor _contextAccessor;
/// <summary>
/// 当前上下文
/// </summary>
public static Microsoft.AspNetCore.Http.HttpContext Current => _contextAccessor.HttpContext;
public static void Configure(IHttpContextAccessor contextAccessor)
{
_contextAccessor = contextAccessor;
}
}
}
using AutoTurnOver.Utility;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Filters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace AutoTurnOver.Models
{
public class NoLoginAttribute : Attribute
{
}
public class UserFilterAttribute : ActionFilterAttribute
{
/// <summary>
/// 请求验证,当前验证部分不要抛出异常,ExceptionFilter不会处理
/// </summary>
/// <param name="context">请求内容信息</param>
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//filterContext.HttpContext.Response.Headers["Access-Control-Allow-Origin"] = "*";
var context = filterContext.HttpContext;
var isDefined = false;
var controllerActionDescriptor = filterContext.ActionDescriptor as ControllerActionDescriptor;
if (controllerActionDescriptor != null)
{
isDefined = controllerActionDescriptor.MethodInfo.GetCustomAttributes(inherit: true)
.Any(a => a.GetType().Equals(typeof(NoLoginAttribute)));
}
if (isDefined) return;
string token = context.Request.Headers["Authorization"];
if (token != null)
{
var getTokenValid = ConfigHelper.GetValue("Saas_GetTokenValid").ToString();
var getUser = ConfigHelper.GetValue("Saas_GetUser").ToString();
var httpHelper = new HHttpHelper();
httpHelper.AddHeaderValue("Authorization", token);
string tokenValidJson = httpHelper.Request(getTokenValid, HHttpHelper.RequestType.GET);
var objToken = tokenValidJson.ToObj<TokenResult>();
if (objToken.result)
{
var userInfo = context.Session.GetString("UserInfo");
if (string.IsNullOrWhiteSpace(userInfo))
{
string userStr = httpHelper.Request(getUser, HHttpHelper.RequestType.GET);
tokenUser user_info = userStr.ToObj<tokenUser>();
user_info.result.has_admin = false;
context.Session.SetString("UserInfo", user_info.result.ToJson());
}
return;
}
else
{
context.Response.StatusCode = 401;
filterContext.Result = new ContentResult
{
Content = "未授权",
StatusCode = StatusCodes.Status401Unauthorized,
ContentType = "text/html;charset=utf-8"
};
}
}
else
{
context.Response.StatusCode = 401;
filterContext.Result = new ContentResult
{
Content = "未授权",
StatusCode = StatusCodes.Status401Unauthorized,
ContentType = "text/html;charset=utf-8"
};
}
}
}
}
...@@ -33,7 +33,10 @@ namespace AutoTurnOver ...@@ -33,7 +33,10 @@ namespace AutoTurnOver
//services.AddHttpContextAccessor(); //services.AddHttpContextAccessor();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1) services.AddSession();
services.AddMvc(options => {
options.Filters.Add<UserFilterAttribute>(); // 添加身份验证过滤器 -- 菜单操作权限
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.AddJsonOptions(options => { options.SerializerSettings.ContractResolver = new DefaultContractResolver(); }) .AddJsonOptions(options => { options.SerializerSettings.ContractResolver = new DefaultContractResolver(); })
; ;
...@@ -67,6 +70,8 @@ namespace AutoTurnOver ...@@ -67,6 +70,8 @@ namespace AutoTurnOver
//.AllowAnyHeader() //.AllowAnyHeader()
//.AllowCredentials() //.AllowCredentials()
//); //);
MyHttpContext.Configure(app.ApplicationServices.GetRequiredService<Microsoft.AspNetCore.Http.IHttpContextAccessor>());
app.UseSession();
app.UseMiddleware<CorsMiddleware>(); app.UseMiddleware<CorsMiddleware>();
app.UseMvc(routes => app.UseMvc(routes =>
{ {
......
...@@ -35,5 +35,9 @@ ...@@ -35,5 +35,9 @@
}, },
"QiYeJiQiRen": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=5fa4c1d5-ce65-4e8a-9ae9-a0d689a13b65", "QiYeJiQiRen": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=5fa4c1d5-ce65-4e8a-9ae9-a0d689a13b65",
"GetSchedulings": "http://oa.bailuntec.com/Api/Cq/GetSchedulings?userID=2409", "GetSchedulings": "http://oa.bailuntec.com/Api/Cq/GetSchedulings?userID=2409",
"SkuSys_CategoryList": "http://api.skums.bailuntec.com/api/category/simplecategory/categoriessimplebylevel" "SkuSys_CategoryList": "http://api.skums.bailuntec.com/api/category/simplecategory/categoriessimplebylevel",
"Saas_GetTokenValid": "http://sso.bailuntec.com/GetTokenValidation",
"Saas_GetUser": "http://sso.bailuntec.com/GetUserResource",
"Saas_Users": "http://sso.bailuntec.com/GetUserByCompany",
"Saas_Departments": "http://sso.bailuntec.com/GetDepartmentsByCompanyId"
} }
...@@ -35,5 +35,9 @@ ...@@ -35,5 +35,9 @@
}, },
"QiYeJiQiRen": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=5fa4c1d5-ce65-4e8a-9ae9-a0d689a13b65", "QiYeJiQiRen": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=5fa4c1d5-ce65-4e8a-9ae9-a0d689a13b65",
"GetSchedulings": "http://oa.bailuntec.com/Api/Cq/GetSchedulings?userID=2409", "GetSchedulings": "http://oa.bailuntec.com/Api/Cq/GetSchedulings?userID=2409",
"SkuSys_CategoryList": "http://api.skums.bailuntec.com/api/category/simplecategory/categoriessimplebylevel" "SkuSys_CategoryList": "http://api.skums.bailuntec.com/api/category/simplecategory/categoriessimplebylevel",
"Saas_GetTokenValid": "http://sso.bailuntec.com/GetTokenValidation",
"Saas_GetUser": "http://sso.bailuntec.com/GetUserResource",
"Saas_Users": "http://sso.bailuntec.com/GetUserByCompany",
"Saas_Departments": "http://sso.bailuntec.com/GetDepartmentsByCompanyId"
} }
...@@ -35,5 +35,9 @@ ...@@ -35,5 +35,9 @@
}, },
"QiYeJiQiRen": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=5fa4c1d5-ce65-4e8a-9ae9-a0d689a13b65", "QiYeJiQiRen": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=5fa4c1d5-ce65-4e8a-9ae9-a0d689a13b65",
"GetSchedulings": "http://oa.bailuntec.com/Api/Cq/GetSchedulings?userID=2409", "GetSchedulings": "http://oa.bailuntec.com/Api/Cq/GetSchedulings?userID=2409",
"SkuSys_CategoryList": "http://api.skums.bailuntec.com/api/category/simplecategory/categoriessimplebylevel" "SkuSys_CategoryList": "http://api.skums.bailuntec.com/api/category/simplecategory/categoriessimplebylevel",
"Saas_GetTokenValid": "http://sso.bailuntec.com/GetTokenValidation",
"Saas_GetUser": "http://sso.bailuntec.com/GetUserResource",
"Saas_Users": "http://sso.bailuntec.com/GetUserByCompany",
"Saas_Departments": "http://sso.bailuntec.com/GetDepartmentsByCompanyId"
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment