From 5645554063d6f050cc8986ecaef640da0e921934 Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Thu, 19 Sep 2024 14:00:01 -0500 Subject: [PATCH] AllowMultipleDeviceLoginUserIds --- .../Users/Settings/AccountSetting.cs | 1 + .../Filters/UserSingleLoginFilter.cs | 20 +++++++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Users/Settings/AccountSetting.cs b/src/Infrastructure/BotSharp.Abstraction/Users/Settings/AccountSetting.cs index 06176ce6..17151d7e 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Users/Settings/AccountSetting.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Users/Settings/AccountSetting.cs @@ -6,4 +6,5 @@ public class AccountSetting /// Whether to enable verification code to verify the authenticity of new users /// public bool NewUserVerification { get; set; } + public string[] AllowMultipleDeviceLoginUserIds { get; set; } = []; } diff --git a/src/Infrastructure/BotSharp.OpenAPI/Filters/UserSingleLoginFilter.cs b/src/Infrastructure/BotSharp.OpenAPI/Filters/UserSingleLoginFilter.cs index eb938742..d7c35c8e 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/Filters/UserSingleLoginFilter.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/Filters/UserSingleLoginFilter.cs @@ -1,5 +1,7 @@ +using BotSharp.Abstraction.Users.Settings; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Mvc.Filters; +using Microsoft.Extensions.Configuration; using Microsoft.Net.Http.Headers; using System.IdentityModel.Tokens.Jwt; @@ -8,10 +10,12 @@ namespace BotSharp.OpenAPI.Filters public class UserSingleLoginFilter : IAuthorizationFilter { private readonly IUserService _userService; + private readonly IServiceProvider _services; - public UserSingleLoginFilter(IUserService userService) + public UserSingleLoginFilter(IUserService userService, IServiceProvider services) { _userService = userService; + _services = services; } public void OnAuthorization(AuthorizationFilterContext context) @@ -19,7 +23,15 @@ namespace BotSharp.OpenAPI.Filters var bearerToken = GetBearerToken(context); if (!string.IsNullOrWhiteSpace(bearerToken)) { - if (GetJwtTokenExpires(bearerToken).ToLongTimeString() != GetUserExpires().ToLongTimeString()) + var config = _services.GetRequiredService(); + var token = GetJwtToken(bearerToken); + + if (config.AllowMultipleDeviceLoginUserIds.Contains(token.Claims.First(x => x.Type == "nameid").Value)) + { + return; + } + + if (token.ValidTo.ToLongTimeString() != GetUserExpires().ToLongTimeString()) { context.Result = new UnauthorizedResult(); } @@ -40,11 +52,11 @@ namespace BotSharp.OpenAPI.Filters return null; } - private DateTime GetJwtTokenExpires(string jwtToken) + private JwtSecurityToken GetJwtToken(string jwtToken) { var handler = new JwtSecurityTokenHandler(); var token = handler.ReadJwtToken(jwtToken); - return token.ValidTo; + return token; } private DateTime GetUserExpires()