usingMicrosoft.AspNetCore.Http;usingMicrosoft.AspNetCore.Identity;usingMicrosoft.AspNetCore.Mvc;usingMicrosoft.AspNetCore.Mvc.Filters;usingMicrosoft.Extensions.Configuration;usingNewtonsoft.Json;usingSilver.Core;usingSilver.Core.Domain.Identity;usingSystem;usingSystem.Linq;usingSystem.Threading.Tasks;usingSystem.Web;usingMicrosoft.Extensions.Logging;namespaceSilver.Web.Framework.Attributes {public classWeChatAttribute : TypeFilterAttribute {public WeChatAttribute() : base(typeof(AsyncLoginImpl)) {
}private classAsyncLoginImpl : IAsyncActionFilter {public AsyncLoginImpl(UserManager userManager, SignInManager signInManager, IConfiguration cfg, IHttpHelper http, ILoggerlogger) {
_userManager=userManager;
_signInManager=signInManager;
_cfg=cfg;
_http=http;
_logger=logger;
}private readonly UserManager_userManager;private readonly SignInManager_signInManager;private readonlyIConfiguration _cfg;private readonlyIHttpHelper _http;private readonly ILogger_logger;public asyncTask OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) {var httpContext =context.HttpContext;if(_signInManager.IsSignedIn(httpContext.User))awaitnext();else if (httpContext.Request.Headers["User-Agent"].ToString()
.IndexOf("MicroMessenger", StringComparison.OrdinalIgnoreCase) > 0) {var query =httpContext.Request.Query;var code = query.SingleOrDefault(c => c.Key == "code");var appid = _cfg.GetValue("Authentication:WeChat:AppID");var appsecret = _cfg.GetValue("Authentication:WeChat:AppSecret");if (string.IsNullOrEmpty(code.Value)) {var redirect_uri = HttpUtility.UrlEncode(_cfg.GetValue("Url"));var url =$"https://open.weixin.qq.com/connect/oauth2/authorize?appid={appid}&redirect_uri={redirect_uri}&response_type=code&scope=snsapi_base&state=login#wechat_redirect";
context.Result= newRedirectResult(url);
}else {var url = $"https://api.weixin.qq.com/sns/oauth2/access_token?appid={appid}&secret={appsecret}&code={code.Value}&grant_type=authorization_code";var data = _http.Get(url);if (data.IndexOf("access_token", StringComparison.Ordinal) > 0) {var accessToken =JsonConvert.DeserializeObject(data);var user = _userManager.Users.SingleOrDefault(c => c.WeChatUserOpenId ==accessToken.openid);if (user == null) {
httpContext.Response.Cookies.Append("openid", accessToken.openid, newCookieOptions {
Expires= DateTime.Now.AddMinutes(60)
});awaitnext();
}else{await _signInManager.SignInAsync(user, true);
context.Result= new RedirectResult("/");
}
}else{var errCode =JsonConvert.DeserializeObject(data);
_logger.LogError($"请求openId发生错误,错误代码:{errCode.errcode},错误消息:{errCode.errmsg}");awaitnext();
}
}
}else{awaitnext();
}
}
}protected classAccessTokenModel {public string access_token { get; set; }public string expires_in { get; set; }public string refresh_token { get; set; }public string openid { get; set; }public string scope { get; set; }
}protected classErrCodeModel {public string errcode { get; set; }public string errmsg { get; set; }
}protected classUserInfo {public string openid { get; set; }public string nickname { get; set; }public string sex { get; set; }public string province { get; set; }public string city { get; set; }public string country { get; set; }public string headimgurl { get; set; }public string unionid { get; set; }
}
}
}