iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Asp.Net Core如何添加请求头自定义认证
  • 371
分享到

Asp.Net Core如何添加请求头自定义认证

2023-06-14 13:06:39 371人浏览 独家记忆
摘要

小编给大家分享一下ASP.net core如何添加请求头自定义认证,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!要点实现 IAuthenticationHandler 接口:4 个方法首先会调用 InitializeAsy

小编给大家分享一下ASP.net core如何添加请求头自定义认证,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

要点

实现 IAuthenticationHandler 接口:4 个方法

  1. 首先会调用 InitializeAsync 获取到 scheme 和 context

  2. 然后调用 AuthenticateAsync ,在这里获取 context 中的 Header 中需要传过来的验证信息,然后进行相关验证,根据不同的结果会分别调用 ChallengeAsync 或者 ForbidAsync

public class HeaderAuth : IAuthenticationHandler {       public AuthenticationScheme Scheme { get; private set; }       public HttpContext CurrentContext { get; private set; }       public Task<AuthenticateResult> AuthenticateAsync() {           var token = CurrentContext.Request.Headers[GuidToken.GUID_TOKEN_KEY].ToString();           var (isValid, tokenEntity) = GuidToken.Valid(token);           if (!isValid || tokenEntity == null) {               return Task.FromResult(AuthenticateResult.Fail("未登录或授权已过期。"));           }           // 生成 AuthenticationTicket           AuthenticationTicket ticket = new AuthenticationTicket(tokenEntity.ToClaimsPrincipal(), Scheme.Name);           return Task.FromResult(AuthenticateResult.Success(ticket));       }       public Task ChallengeAsync(AuthenticationProperties properties) {           CurrentContext.Response.StatusCode = (int)httpstatusCode.Unauthorized;           return Task.CompletedTask;       }       public Task ForbidAsync(AuthenticationProperties properties) {           CurrentContext.Response.StatusCode = (int)HttpStatusCode.Forbidden;           return Task.CompletedTask;       }       public Task InitializeAsync(AuthenticationScheme scheme, HttpContext context) {           Scheme = scheme;           CurrentContext = context;           return Task.CompletedTask;       }   }

GuidToken 类就是我们自定义的 token 管理器

public class GuidToken {        public const string GUID_TOKEN_NAME = "MtGuidTokenAuthentication";        public const string DEFAULT_AUTHENTICATION_TYPE = "local";        public const int TOKEN_LENGTH = 32;        public const string GUEST = "GUEST";        public const string DEFAULT_ROLE = "USER";        public const string DEFAULT_OPENID = "DEFAULT_OPENID";        public const string GUID_TOKEN_KEY = "Token";        private static int expireDuration = 0;        public string OpenId { get; set; }        public string Role { get; set; }        public DateTime Expire { get; set; }        private static readonly Dictionary<string, GuidToken> tokenCache = new Dictionary<string, GuidToken>();        public static (bool, GuidToken) Valid(string token) {            if (string.IsNullOrEmpty(token) || token.Length != TOKEN_LENGTH) {                return (false, null);            }            // 从 Session 中获取令牌实体            GuidToken tokenEntity = GetTokenCache();            if (tokenEntity == null) {                return (false, null);            } else {                tokenEntity.Expire = DateTime.Now.AddMinutes(expireDuration);            }            return (true, tokenEntity);            GuidToken GetTokenCache() {                if (tokenCache.TryGetValue(token, out var val)) {                    if (val.Expire > DateTime.Now) return val;                    else tokenCache.Remove(token);                }                return null;            }        }        public static string Create(string openId = DEFAULT_OPENID, string role = DEFAULT_ROLE, int minutes = 30) {            var token = Guid.NewGuid().ToString("N");            expireDuration = minutes;            var entity = new GuidToken {                OpenId = openId,                Role = role,                Expire = DateTime.Now.AddMinutes(expireDuration)            };            tokenCache.Add(token, entity);            return token;        }        /// <summary>        /// 令牌实体 转 ClaimsPrincipal        /// </summary>        /// <param name="token"></param>        /// <returns></returns>        public ClaimsPrincipal ToClaimsPrincipal() {            var claimsIdentity = new ClaimsIdentity(new Claim[] {                new Claim(ClaimTypes.Name, OpenId),                new Claim(ClaimTypes.Role, Role),            }, GuidToken.DEFAULT_AUTHENTICATION_TYPE);            var claimsPrincipal = new ClaimsPrincipal(claimsIdentity);            return claimsPrincipal;        }    }

最后就是使用方式

在 Startup 中配置

public void ConfigureServices(IServiceCollection services) {    // 注册使用    services.AddAuthentication(options => {        options.AddScheme<HeaderAuth>(GuidToken.GUID_TOKEN_NAME, "Default Guid Token");        options.DefaultAuthenticateScheme = GuidToken.GUID_TOKEN_NAME;        options.DefaultChallengeScheme = GuidToken.GUID_TOKEN_NAME;    });}public void Configure(IApplicationBuilder app, IWEBHostEnvironment env) {    if (env.IsDevelopment()) {        app.UseDeveloperExceptionPage();    }    app.UseCors("any");    app.UseStaticFiles();    // 开启认证    app.UseAuthentication();    app.UseRouting();    // 开启授权    app.UseAuthorization();    app.UseEndpoints(endpoints => {        endpoints.MapControllers();    });}

在控制器中使用标签

[Authorize]public class JobController : ControllerBase {}

看完了这篇文章,相信你对“Asp.net core如何添加请求头自定义认证”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: Asp.Net Core如何添加请求头自定义认证

本文链接: https://www.lsjlt.com/news/271149.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作