/// <summary> /// 静默授权 /// </summary> /// <returns></returns> public ResultContent <LoginResponse> SilentAuth() { var redis = UnityConfig.Container.Resolve <IRedisConnector>(); var sessionId = RedisSession.SessionId; var isSetApiKey = redis.HashExists(sessionId, Resources.AppResource.ApiKeyHeader); var isSetToken = redis.HashExists(sessionId, Resources.AppResource.TokenHeader); var isSetExpire = redis.HashExists(sessionId, Resources.AppResource.ExpireHeader); if (isSetApiKey && isSetToken && isSetExpire) { var expire = Convert.ToDateTime(redis.HashGetStr(sessionId, Resources.AppResource.ExpireHeader), Resources.AppResource.Culture); var tokenString = redis.HashGetStr(sessionId, Resources.AppResource.TokenHeader); var hash = UnityConfig.Container.Resolve <IHash>(); if (expire > DateTime.Now) { var result = ResponseUtility.InitResult <LoginResponse>(MessageCode.Success); var response = new LoginResponse { Token = hash.ComputeHash(tokenString), Expire = expire }; result.Data = response; return(result); } } return(ResponseUtility.InitResult <LoginResponse>(MessageCode.SilentAuthFail)); }
/// <summary>执行异步异常筛选器。</summary> /// <returns>异步异常筛选器。</returns> /// <param name="actionExecutedContext">操作执行的上下文。</param> /// <param name="cancellationToken">取消标记。</param> public Task ExecuteExceptionFilterAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken) { return(Task.Run(() => { var log = UnityConfig.Container.Resolve <ILogWapper>(Resources.AppResource.WebApiExceptionLogName); log.Error(actionExecutedContext.Exception, actionExecutedContext.Request.RequestUri.LocalPath); var apiException = ResponseUtility.InitResult <object>(MessageCode.ApiInterfaceException); apiException.Data = actionExecutedContext.Exception.Message; actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse(HttpStatusCode.InternalServerError, apiException); }, cancellationToken)); }
protected override async Task <HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { if (request.Headers.Contains(Resources.AppResource.ApiKeyHeader)) { var token = request.Headers.GetValues(Resources.AppResource.ApiKeyHeader).First(); if (Validate(token)) { return(await base.SendAsync(request, cancellationToken)); } } var response = await base.SendAsync(request, cancellationToken); var errorkey = ResponseUtility.InitResult <object>(MessageCode.ApiKeyValiFail); response.Content = new ObjectContent(errorkey.GetType(), errorkey, new JsonMediaTypeFormatter()); return(response); }
/// <summary>异步执行筛选器操作。</summary> /// <returns>为此操作新建的任务。</returns> /// <param name="actionContext">操作上下文。</param> /// <param name="cancellationToken">为此任务分配的取消标记。</param> /// <param name="continuation">在调用操作方法之后,委托函数将继续。</param> public Task <HttpResponseMessage> ExecuteActionFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func <Task <HttpResponseMessage> > continuation) { if (actionContext.Request.Headers.Contains(Resources.AppResource.TokenHeader)) { var token = actionContext.Request.Headers.GetValues(Resources.AppResource.TokenHeader).First(); if (TokenAuth(token)) { return(continuation.Invoke()); } } var errorToken = ResponseUtility.InitResult <object>(MessageCode.TokenAuthFail); var errorTokenMessage = new HttpResponseMessage { Content = new ObjectContent(errorToken.GetType(), errorToken, new JsonMediaTypeFormatter()) }; return(Task.FromResult(errorTokenMessage)); }
/// <summary> /// 用户登陆 /// </summary> /// <param name="request">登陆请求</param> /// <returns>登陆结果</returns> public ResultContent <LoginResponse> Login([FromBody] LoginRequest request) { // todo Check UserName And PassWord if (string.Equals(request.UserName, @"super") && string.Equals(request.PassWord, @"123456")) { var result = ResponseUtility.InitResult <LoginResponse>(MessageCode.Success); var expire = DateTime.Now.AddDays(1); var token = new Token { Id = 1, UserName = "******", Expire = expire, Type = Resources.AppResource.AccessToken }; var crypt = UnityConfig.Container.Resolve <ICrypt>(); var hash = UnityConfig.Container.Resolve <IHash>(); var tokenString = crypt.Encrypt(JsonConvert.SerializeObject(token, Formatting.None)); var response = new LoginResponse { Token = hash.ComputeHash(tokenString), Expire = expire }; result.Data = response; RedisSession[Resources.AppResource.TokenHeader] = tokenString; RedisSession[Resources.AppResource.ExpireHeader] = expire.ToString(Resources.AppResource.Culture); return(result); } return(ResponseUtility.InitResult <LoginResponse>(MessageCode.UserNameOrPassWordError)); }