diff --git a/Infrastructure/Auth/CacheKey.cs b/Infrastructure/Auth/CacheKey.cs new file mode 100644 index 00000000..5018e5f3 --- /dev/null +++ b/Infrastructure/Auth/CacheKey.cs @@ -0,0 +1,20 @@ +using System.Web; + +namespace Infrastructure.Auth +{ + public class CacheKey + { + public static string SessionName = "OpenAuth"; + public static string UserSessionName = "Session_"; + private static string GetSessionId() + { + HttpCookie cookie = HttpContext.Current.Request.Cookies.Get(SessionName); + string remoteBrowserIp = WebUtility.GetIP(); + return UserSessionName + remoteBrowserIp + ":" + cookie.Value; + } + public static string UserID + { + get { return GetSessionId(); } + } + } +} diff --git a/Infrastructure/Auth/CacheSession.cs b/Infrastructure/Auth/CacheSession.cs new file mode 100644 index 00000000..e3c46428 --- /dev/null +++ b/Infrastructure/Auth/CacheSession.cs @@ -0,0 +1,79 @@ +using Infrastructure.Cache; +using System; +using System.Web; + +namespace Infrastructure.Auth +{ + public class CacheSession + { + ICache cache = DIContainer.Resolve(); + private HttpContext context; + public CacheSession(bool IsReadOnly) + { + this.IsReadOnly = IsReadOnly; + } + public CacheSession(HttpContext context, bool IsReadOnly, TimeSpan TimeOut, ICache cacheService) + { + this.context = context; + this.IsReadOnly = IsReadOnly; + this.TimeOut = TimeOut; + } + public CacheSession(HttpContext context, bool IsReadOnly) + { + this.context = context; + this.IsReadOnly = IsReadOnly; + GetSessionId(); + if (CacheKey.UserID != null) + { + var userInfo = cache.Get(CacheKey.UserID); + } + } + //获取会话是否已经验证通过 + public bool IsAuthenticated + { + get + { + if (cache.Get(SessionId) == null) + { + return false; + } + else + { + return true; + } + } + } + + //会话唯一Id + public string SessionId + { + get + { + return GetSessionId(); + } + } + public static string SessionName = CacheKey.SessionName; + public static string UserSessionName = CacheKey.UserSessionName; + //指示会话是否为只读,true为只读 + public bool IsReadOnly { get; set; } + //超时期限 + public TimeSpan TimeOut { get; set; } + private string GetSessionId() + { + HttpCookie cookie = context.Request.Cookies.Get(SessionName); + string remoteBrowserIp = WebUtility.GetIP(); + if (cookie == null || string.IsNullOrEmpty(cookie.Value)) + { + string newSessionId = Guid.NewGuid().ToString(); + HttpCookie newCookie = new HttpCookie(SessionName, newSessionId); + newCookie.HttpOnly = IsReadOnly; + context.Response.Cookies.Add(newCookie); + return UserSessionName + remoteBrowserIp + ":" + newSessionId; + } + else + { + return UserSessionName + remoteBrowserIp + ":" + cookie.Value; + } + } + } +} diff --git a/Infrastructure/Auth/FormsAuthenticationService.cs b/Infrastructure/Auth/FormsAuthenticationService.cs new file mode 100644 index 00000000..f018f946 --- /dev/null +++ b/Infrastructure/Auth/FormsAuthenticationService.cs @@ -0,0 +1,48 @@ +using Infrastructure.Cache; +using System; +using System.Web; + +namespace Infrastructure.Auth +{ + /// + /// 身份认证服务实现(缓存可分布式部署) + /// + public class FormsAuthenticationService : IAuthenticationService + { + ICache cacheService; + CacheSession cacheSession; + HttpContext httpContext = HttpContext.Current; + //hpf 缓存相关 + public FormsAuthenticationService() + { + cacheService = DIContainer.Resolve(); + cacheSession = new CacheSession(httpContext, true); + } + /// + /// 获取当前认证的用户 + /// + /// 当前用户未通过认证则返回null + public dynamic GetAuthenticatedUser() + { + if (httpContext == null || !cacheSession.IsAuthenticated) + { + return null;//hpf未登录 + } + return cacheService.Get(cacheSession.SessionId); + } + + public void SignIn(string loginName, dynamic userInfo, TimeSpan expiration) + { + var sessionId = cacheSession.SessionId; + cacheService.Set(sessionId, userInfo, expiration); + } + + public void SignOut() + { + if (!string.IsNullOrEmpty(CacheKey.UserID)) + { + cacheService.Remove(CacheKey.UserID); + } + } + } +} diff --git a/Infrastructure/Auth/IAuthenticationService.cs b/Infrastructure/Auth/IAuthenticationService.cs new file mode 100644 index 00000000..9ef3b2dd --- /dev/null +++ b/Infrastructure/Auth/IAuthenticationService.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Infrastructure.Auth +{ + /// + /// 用于身份认证接口 + /// + public interface IAuthenticationService + { + /// + /// 登录 + /// + /// 登录名 + /// 与登录名相关的用户信息 + /// 登录Cookie的过期时间,单位:分钟。 + void SignIn(string loginName, dynamic userInfo, TimeSpan expiration); + /// + /// 注销 + /// + void SignOut(); + /// + /// 获取当前登录的用户 + /// + /// 当前用户未通过认证则返回null + dynamic GetAuthenticatedUser(); + } +} diff --git a/Infrastructure/Auth/UserContext.cs b/Infrastructure/Auth/UserContext.cs new file mode 100644 index 00000000..7e623768 --- /dev/null +++ b/Infrastructure/Auth/UserContext.cs @@ -0,0 +1,20 @@ +namespace Infrastructure.Auth +{ + /// + /// 当前登录用户相关 + /// + public class UserContext + { + public static dynamic CurrentUser + { + get + { + IAuthenticationService authenticationService = DIContainer.ResolvePerHttpRequest(); + var currentUser = authenticationService.GetAuthenticatedUser(); + if (currentUser != null) + return currentUser; + return null; + } + } + } +} diff --git a/Infrastructure/DIContainer.cs b/Infrastructure/DIContainer.cs new file mode 100644 index 00000000..f3673c40 --- /dev/null +++ b/Infrastructure/DIContainer.cs @@ -0,0 +1,75 @@ +using Autofac; +using Autofac.Core; +using System.Web.Mvc; + +namespace Infrastructure +{ + /// + /// 依赖注入 + /// + public class DIContainer + { + private static IContainer iContainer; + public static void RegisterContainer(IContainer container) + { + iContainer = container; + } + /// + /// 按类型获取组件 + /// + /// + /// + public static Tservice Resolve() + { + return ResolutionExtensions.Resolve(iContainer); + } + /// + /// 按参数获取组件 + /// + /// + /// + /// + public static Tservice Resolve(params Parameter[] parameters) + { + return ResolutionExtensions.Resolve(iContainer, parameters); + } + /// + /// 按key获取组件 + /// + /// 组件类型 + /// 枚举类型的key + /// 返回获取的组件 + public static Tservice ResolveKeyed(object serviceKey) + { + return ResolutionExtensions.ResolveKeyed(iContainer, serviceKey); + } + /// + /// 按名称获取组件 + /// + /// + /// + /// + public static Tservice ResolveNamed(string serviceName) + { + return ResolutionExtensions.ResolveNamed(iContainer, serviceName); + } + /// + /// 获取InstancePerHttpRequest的组件 mvc + /// + /// + /// + public static Tservice ResolvePerHttpRequest() + { + IDependencyResolver current = DependencyResolver.Current; + if (current != null) + { + Tservice service = (Tservice)current.GetService(typeof(Tservice)); + if (service != null) + { + return service; + } + } + return ResolutionExtensions.Resolve(iContainer); + } + } +} diff --git a/Infrastructure/Infrastructure.csproj b/Infrastructure/Infrastructure.csproj index b7226120..477b5984 100644 --- a/Infrastructure/Infrastructure.csproj +++ b/Infrastructure/Infrastructure.csproj @@ -32,6 +32,10 @@ 4 + + ..\packages\Autofac.3.5.2\lib\net40\Autofac.dll + True + ..\packages\AutoMapper.4.1.0\lib\net45\AutoMapper.dll @@ -75,6 +79,11 @@ + + + + + @@ -82,6 +91,7 @@ + @@ -90,6 +100,11 @@ + + + + + @@ -97,13 +112,12 @@ + - - - +