using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.Controllers; using Microsoft.Extensions.Primitives; namespace TEAMModelOS.SDK.Extension { public static class HttpContextExtensions { /// /// 取得驗證金鑰,Authorization /// public static string GetToken(this HttpContext httpContext) { return httpContext.Request.Headers["Authorization"].ToString(); } /// /// 获取 Action 特性 /// /// /// /// public static TAttribute GetMetadata(this HttpContext httpContext) where TAttribute : class { return httpContext.GetEndpoint()?.Metadata?.GetMetadata(); } /// /// 获取 控制器/Action 描述器 /// /// /// public static ControllerActionDescriptor GetControllerActionDescriptor(this HttpContext httpContext) { return httpContext.GetEndpoint()?.Metadata?.FirstOrDefault(u => u is ControllerActionDescriptor) as ControllerActionDescriptor; } /// /// 获取本机 IPv4地址 /// /// /// public static string GetLocalIpAddressToIPv4(this HttpContext context) { return context.Connection.LocalIpAddress?.MapToIPv4()?.ToString(); } /// /// 获取本机 IPv6地址 /// /// /// public static string GetLocalIpAddressToIPv6(this HttpContext context) { return context.Connection.LocalIpAddress?.MapToIPv6()?.ToString(); } /// /// 获取远程 IPv4地址 /// /// /// public static string GetRemoteIpAddressToIPv4(this HttpContext context) { return context.Connection.RemoteIpAddress?.MapToIPv4()?.ToString(); } /// /// 获取远程 IPv6地址 /// /// /// public static string GetRemoteIpAddressToIPv6(this HttpContext context) { return context.Connection.RemoteIpAddress?.MapToIPv6()?.ToString(); } /// /// 获取完整请求地址 /// /// /// public static string GetRequestUrlAddress(this HttpRequest request) { return new StringBuilder() .Append(request.Scheme) .Append("://") .Append(request.Host) .Append(request.PathBase) .Append(request.Path) .Append(request.QueryString) .ToString(); } /// /// 获取来源地址 /// /// /// /// public static string GetRefererUrlAddress(this HttpRequest request, string refererHeaderKey = "Referer") { return request.Headers[refererHeaderKey].ToString(); } /// /// 读取 Body 内容 /// /// /// 需先在 Startup 的 Configure 中注册 app.EnableBuffering() /// public static async Task ReadBodyContentAsync(this HttpContext httpContext) { if (httpContext == null) return default; return await httpContext.Request.ReadBodyContentAsync(); } /// /// 读取 Body 内容 /// /// /// 需先在 Startup 的 Configure 中注册 app.EnableBuffering() /// public static async Task ReadBodyContentAsync(this HttpRequest request) { request.Body.Seek(0, SeekOrigin.Begin); using var reader = new StreamReader(request.Body, Encoding.UTF8, true, 1024, true); var body = await reader.ReadToEndAsync(); // 回到顶部,解决此类问题 https://gitee.com/dotnetchina/Furion/issues/I6NX9E request.Body.Seek(0, SeekOrigin.Begin); return body; } /// /// 判断是否是 WebSocket 请求 /// /// /// public static bool IsWebSocketRequest(this HttpContext context) { return context.WebSockets.IsWebSocketRequest || context.Request.Path == "/ws"; } /// /// 设置响应头 Tokens /// /// /// /// public static void SetTokensOfResponseHeaders(this HttpContext httpContext, string accessToken, string refreshToken = null) { httpContext.Response.Headers["access-token"] = accessToken; if (!string.IsNullOrWhiteSpace(refreshToken)) { httpContext.Response.Headers["x-access-token"] = refreshToken; } } /// /// 取得JWT驗證金鑰,Authorization Bearer /// /// /// public static string GetJwtToken(this HttpContext httpContext) { var token = string.Empty; string authorization = httpContext.Request.Headers["Authorization"].ToString(); if (!string.IsNullOrWhiteSpace(authorization) && authorization.StartsWith("Bearer ", StringComparison.OrdinalIgnoreCase)) { token = authorization.Substring("Bearer ".Length).Trim(); } return token; } /// /// 取得遠端呼叫的IP /// public static string GetRemoteIP(this HttpContext httpContext) { return httpContext?.Connection?.RemoteIpAddress?.ToString(); } /// /// 取得X-Auth-Key值 /// /// Key Name /// public static string GetXAuth(this HttpContext httpContext, string key = null) { try { if (httpContext.Request.Headers.TryGetValue($"X-Auth-{key}", out StringValues value)) return value.ToString(); else return null; } catch { return null; } } /// /// 取得X-Auth-Key值 /// /// Key Name /// public static string GetAuthorization(this HttpContext httpContext) { try { if (httpContext.Request.Headers.TryGetValue("Authorization", out StringValues value)) return value.ToString(); else return null; } catch { return null; } } /// /// 取得AuthToken權杖資訊 /// /// Key Name /// public static (string id, string school) GetApiTokenInfo(this HttpContext httpContext, string key = null) { object id = null, school = null; httpContext?.Items.TryGetValue("ID", out id); httpContext?.Items.TryGetValue("School", out school); return (id?.ToString(), school?.ToString()); } /// /// 取得AuthToken權杖資訊 /// /// Key Name /// public static (string id, string name, string picture, string school) GetAuthTokenInfo(this HttpContext httpContext, string key = null) { object id = null, name = null, picture = null, school = null; httpContext?.Items.TryGetValue("ID", out id); httpContext?.Items.TryGetValue("Name", out name); httpContext?.Items.TryGetValue("Picture", out picture); httpContext?.Items.TryGetValue("School", out school); return (id?.ToString(), name?.ToString(), picture?.ToString(), school?.ToString()); } /// /// 取得AuthToken權杖資訊 /// /// Key Name /// public static (string id, string name, string picture, string school, string area, string keyData) GetAuthTokenKey(this HttpContext httpContext, string key = null) { object id = null, name = null, picture = null, school = null, area = null, keyData = null; httpContext?.Items.TryGetValue("ID", out id); httpContext?.Items.TryGetValue("Name", out name); httpContext?.Items.TryGetValue("Picture", out picture); httpContext?.Items.TryGetValue("School", out school); httpContext?.Items.TryGetValue("Area", out area); if (!string.IsNullOrWhiteSpace(key)) { httpContext?.Items.TryGetValue(key, out keyData); } return (id?.ToString(), name?.ToString(), picture?.ToString(), school?.ToString(), area?.ToString(), keyData?.ToString()); } /// /// 取得User-Agent值 /// public static string GetUserAgent(this HttpContext httpContext) { try { return httpContext.Request.Headers["User-Agent"].ToString(); } catch { return null; } } /// /// 取得Scheme值 /// public static string GetScheme(this HttpContext httpContext) { return httpContext?.Request?.Scheme; } /// /// 取得HostName值 /// public static string GetHostName(this HttpContext httpContext) { return httpContext?.Request?.Host.ToString(); } /// /// 设置本地cookie /// /// 键 /// 值 /// 过期时长,单位:分钟 public static void SetCookies(HttpResponse Response, string key, string value, int minutes = 30) { Response.Cookies.Append(key, value, new CookieOptions { Expires = DateTimeOffset.Now.AddMinutes(minutes) }); } /// /// 删除指定的cookie /// /// 键 public static void DeleteCookies(HttpContext httpContext, string key) { httpContext.Response.Cookies.Delete(key); } } }