internal BearerToken CreateAccessToken(ClaimsPrincipal claimsPrincipal, TimeSpan validTime) { byte[] encryptedToken; using (var stream = GlobalVars.RecyclableMemory.GetStream("claims-principal", 32)) { using (var bwriter = new BinaryWriter(stream, Encoding.UTF8, true)) { claimsPrincipal.WriteTo(bwriter); } byte[] serializedClaims = stream.ToArray(); DateTime validity = DateTime.Now + validTime; var serverBearer = new ServerAccessToken(serializedClaims, validity); using (var mem = GlobalVars.RecyclableMemory.GetStream()) { ProtoBuf.Serializer.Serialize(mem, serverBearer); byte[] serializedTmpBuf = mem.GetBuffer(); // Закриптовать. encryptedToken = Jwt.EncryptToBytes(serializedTmpBuf.AsSpan(0, (int)mem.Length)); } var token = new BearerToken(encryptedToken, validity); return(token); } }
private IActionResult SignIn(ServerAccessToken bearerToken) { Debug.Assert(bearerToken.ClaimsPrincipal != null); ClaimsPrincipal user; if (DateTime.Now < bearerToken.Validity) // Токен валиден. { using (var mem = new MemoryStream(bearerToken.ClaimsPrincipal, 0, bearerToken.ClaimsPrincipal.Length, writable: false, publiclyVisible: true)) using (var breader = new BinaryReader(mem, Encoding.UTF8, leaveOpen: true)) { try { user = new ClaimsPrincipal(breader); } catch (EndOfStreamException) { return(new BadRequestResult("Аутентификация не работает на .NET Framework из-за бага")); } catch (Exception) { return(new BadRequestResult("Токен не валиден")); } } } else { return(new BadRequestResult("Токен истёк")); } // Эта строка фактически атомарно аутентифицирует соединение для всех последующих запросов. _user = user; Listener.OnConnectionAuthenticated(this, user); return(new OkResult()); }