FunGame-Server/FunGame.WebAPI/Services/CustomBearerTokenHandler.cs
milimoe ccf75528cb
添加日志级别;添加匿名服务器监听;模组线程安全改进 (#41)
* 添加日志级别;添加匿名服务器监听(不要求客户端安装)

* 修复不同时间多客户端连接游戏模组时可能产生的线程安全问题

* 更新了匿名服务器令牌确认
2025-01-17 18:59:44 +08:00

45 lines
1.8 KiB
C#

using System.Security.Claims;
using System.Text.Encodings.Web;
using Microsoft.AspNetCore.Authentication;
using Microsoft.Extensions.Options;
using Milimoe.FunGame.Core.Api.Utility;
namespace Milimoe.FunGame.WebAPI.Services
{
public class CustomBearerAuthenticationHandler(IOptionsMonitor<AuthenticationSchemeOptions> options, ILoggerFactory logger, UrlEncoder encoder) : AuthenticationHandler<AuthenticationSchemeOptions>(options, logger, encoder)
{
protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{
// 检查是否有 Authorization Header
if (!Request.Headers.TryGetValue("Authorization", out Microsoft.Extensions.Primitives.StringValues value))
{
return AuthenticateResult.Fail("Authorization header is missing.");
}
string authorizationHeader = value.ToString();
if (!authorizationHeader.StartsWith("Bearer ", StringComparison.OrdinalIgnoreCase))
{
return AuthenticateResult.Fail("Invalid Authorization header format.");
}
string token = authorizationHeader["Bearer ".Length..].Trim();
// 验证自定义 Token
string name = WebAPIAuthenticator.ValidateToken(token);
if (name == "")
{
await Task.Delay(1);
return AuthenticateResult.Fail("Invalid Token.");
}
// 如果验证通过,创建 ClaimsIdentity
Claim[] claims = [new Claim(ClaimTypes.Name, name)];
ClaimsIdentity identity = new(claims, Scheme.Name);
ClaimsPrincipal principal = new(identity);
AuthenticationTicket ticket = new(principal, Scheme.Name);
return AuthenticateResult.Success(ticket);
}
}
}