z8018
3 天以前 d8dc91f9c1fece5711e38edd1b1274cb9e579015
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Extensions;
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.Helper;
 
namespace WIDESEA_Core.Extensions
{
    public static class SwaggerContextExtension
    {
        public const string SwaggerCodeKey = "swagger-code";
        public const string SwaggerJwt = "swagger-jwt";
 
        /// <summary>
        /// 检查当前Swagger请求是否验证成功
        /// </summary>
        /// <returns>如果Session中Swagger验证码为"success"则返回true,否则返回false</returns>
        public static bool IsSuccessSwagger()
        {
            return App.HttpContext?.GetSession()?.GetString(SwaggerCodeKey) == "success";
        }
 
        /// <summary>
        /// 判断当前Swagger请求是否已通过验证
        /// </summary>
        /// <param name="context">Http上下文对象</param>
        /// <returns>如果Swagger验证成功返回true,否则返回false</returns>
        public static bool IsSuccessSwagger(this HttpContext context)
        {
            return context.GetSession()?.GetString(SwaggerCodeKey) == "success";
        }
 
        /// <summary>
        /// 设置Swagger验证成功状态
        /// </summary>
        /// <remarks>
        /// 将Swagger验证状态码"success"存储到当前会话中
        /// </remarks>
        public static void SuccessSwagger()
        {
            App.HttpContext?.GetSession()?.SetString(SwaggerCodeKey, "success");
        }
 
        /// <summary>
        /// 设置Swagger操作成功的状态码
        /// </summary>
        /// <param name="context">Http上下文对象</param>
        public static void SuccessSwagger(this HttpContext context)
        {
            context.GetSession()?.SetString(SwaggerCodeKey, "success");
        }
 
        /// <summary>
        /// 为Swagger JWT认证设置成功上下文
        /// </summary>
        /// <param name="context">Http上下文对象</param>
        /// <param name="token">JWT令牌</param>
        /// <remarks>
        /// 将JWT令牌解析为ClaimsIdentity并添加到用户身份中,同时将令牌存储在会话中
        /// </remarks>
        public static void SuccessSwaggerJwt(this HttpContext context, string token)
        {
            var claims = new ClaimsIdentity(GetClaimsIdentity(token));
            context.User.AddIdentity(claims);
            context.GetSession().SetString(SwaggerJwt, token);
        }
 
        /// <summary>
        /// 从JWT令牌中获取声明(Claims)集合
        /// </summary>
        /// <param name="token">JWT令牌字符串</param>
        /// <returns>包含声明信息的集合,若令牌无效则返回空集合</returns>
        private static IEnumerable<Claim> GetClaimsIdentity(string token)
        {
            var jwtHandler = new JwtSecurityTokenHandler();
            // token校验
            if (token.IsNotEmptyOrNull() && jwtHandler.CanReadToken(token))
            {
                var jwtToken = jwtHandler.ReadJwtToken(token);
 
                return jwtToken.Claims;
            }
 
            return new List<Claim>();
        }
 
        /// <summary>
        /// 从当前HTTP上下文中获取成功的Swagger JWT令牌
        /// </summary>
        /// <param name="context">HTTP上下文</param>
        /// <returns>Swagger JWT令牌字符串</returns>
        public static string GetSuccessSwaggerJwt(this HttpContext context)
        {
            return context.GetSession().GetString(SwaggerJwt);
        }
 
 
        /// <summary>
        /// 重定向到Swagger登录页面
        /// </summary>
        /// <param name="context">Http上下文对象</param>
        /// <remarks>
        /// 将当前请求重定向到/swg-login.html页面,并附带当前URL作为返回地址参数
        /// </remarks>
        public static void RedirectSwaggerLogin(this HttpContext context)
        {
            var returnUrl = context.Request.GetDisplayUrl(); //获取当前url地址 
            context.Response.Redirect("/swg-login.html?returnUrl=" + returnUrl);
        }
    }
}