2
0
mirror of https://github.com/esiur/esiur-dotnet.git synced 2026-06-13 22:48:42 +00:00
This commit is contained in:
2026-05-25 23:46:29 +03:00
parent 959bc76721
commit ae6a1fc8d7
8 changed files with 123 additions and 20 deletions
+3 -1
View File
@@ -32,6 +32,7 @@ public class AsyncException : Exception
{ {
public readonly ErrorType Type; public readonly ErrorType Type;
public readonly ExceptionCode Code; public readonly ExceptionCode Code;
//public readonly string Message;
public AsyncException(Exception exception) : base(exception.Message, exception) public AsyncException(Exception exception) : base(exception.Message, exception)
{ {
@@ -42,7 +43,8 @@ public class AsyncException : Exception
public override string StackTrace => InnerException != null && Type == ErrorType.Exception ? InnerException.StackTrace : base.StackTrace; public override string StackTrace => InnerException != null && Type == ErrorType.Exception ? InnerException.StackTrace : base.StackTrace;
public AsyncException(ErrorType type, ushort code, string message) public AsyncException(ErrorType type, ushort code, string message)
: base(type == ErrorType.Management ? ((ExceptionCode)code).ToString() : message) //: base(type == ErrorType.Management ? ((ExceptionCode)code).ToString() : message)
: base(message)
{ {
this.Type = type; this.Type = type;
this.Code = (ExceptionCode)code; this.Code = (ExceptionCode)code;
+5 -5
View File
@@ -99,11 +99,11 @@ public class EpAuthPacket : Packet
set; set;
} }
public string Message //public string Message
{ //{
get; // get;
set; // set;
} //}
public byte[] SessionId public byte[] SessionId
{ {
+11 -2
View File
@@ -714,6 +714,14 @@ public partial class EpConnection : NetworkConnection, IStore
if (_authPacket.AuthMode == AuthenticationMode.None) if (_authPacket.AuthMode == AuthenticationMode.None)
{ {
if (!(Server?.AllowUnauthorizedAccess ?? false))
{
SendAuth(EpAuthPacketMethod.ErrorTerminate);
_invalidCredentials = true;
//Close();
return offset;
}
//@TODO: check if allowed, pass for testing //@TODO: check if allowed, pass for testing
SendAuthHeaders(EpAuthPacketMethod.SessionEstablished, localHeaders); SendAuthHeaders(EpAuthPacketMethod.SessionEstablished, localHeaders);
AuthenticatonCompleted(null, "guest"); AuthenticatonCompleted(null, "guest");
@@ -772,7 +780,6 @@ public partial class EpConnection : NetworkConnection, IStore
SendAuthHeaders(EpAuthPacketMethod.SessionEstablished, localHeaders); SendAuthHeaders(EpAuthPacketMethod.SessionEstablished, localHeaders);
AuthenticatonCompleted(authResult.LocalIdentity, authResult.RemoteIdentity); AuthenticatonCompleted(authResult.LocalIdentity, authResult.RemoteIdentity);
} }
} }
else if (_authPacket.Command == EpAuthPacketCommand.Acknowledge) else if (_authPacket.Command == EpAuthPacketCommand.Acknowledge)
{ {
@@ -897,7 +904,9 @@ public partial class EpConnection : NetworkConnection, IStore
|| _authPacket.Method == EpAuthPacketMethod.ErrorRetry) || _authPacket.Method == EpAuthPacketMethod.ErrorRetry)
{ {
_invalidCredentials = true; _invalidCredentials = true;
OnError?.Invoke(this, _authPacket.ErrorCode, _authPacket.Message ?? "Authentication error."); OnError?.Invoke(this, _authPacket.ErrorCode, "Authentication error.");
_openReply?.TriggerError(new AsyncException(ErrorType.Management, _authPacket.ErrorCode, "Authentication error."));
Close(); Close();
} }
else if (_authPacket.Method == EpAuthPacketMethod.IndicationEstablished) else if (_authPacket.Method == EpAuthPacketMethod.IndicationEstablished)
+6
View File
@@ -53,6 +53,12 @@ public class EpServer : NetworkServer<EpConnection>, IResource
set; set;
} }
[Attribute]
public string[] AllowedAuthenticationProviders { get; set; }
[Attribute]
public bool AllowUnauthorizedAccess { get; set; }
//IMembership membership; //IMembership membership;
//[Attribute] //[Attribute]
@@ -5,7 +5,7 @@ using System.Text;
namespace Esiur.Security.Authority.Providers namespace Esiur.Security.Authority.Providers
{ {
internal class PasswordAuthenticationProvider : IAuthenticationProvider public class PasswordAuthenticationProvider : IAuthenticationProvider
{ {
public string DefaultName => "hash"; public string DefaultName => "hash";
@@ -37,14 +37,14 @@ namespace Esiur.Security.Authority.Providers
return null; return null;
} }
public AsyncReply<bool> Login(Session session) public virtual AsyncReply<bool> Login(Session session)
{ {
throw new NotImplementedException(); return new AsyncReply<bool>(false);
} }
public AsyncReply<bool> Logout(Session session) public virtual AsyncReply<bool> Logout(Session session)
{ {
throw new NotImplementedException(); return new AsyncReply<bool>(false);
} }
} }
} }
@@ -0,0 +1,44 @@
using Esiur.Core;
using Esiur.Security.Authority;
using Esiur.Security.Authority.Providers;
using System;
using System.Collections.Generic;
using System.Security.Principal;
using System.Text;
namespace Esiur.Tests.Functional
{
internal class ClientAuthenticationProvider : PasswordAuthenticationProvider
{
public override (byte[], byte[]) GetHostedAccountCredential(string identity, string domain)
{
throw new NotImplementedException();
}
public override byte[] GetSelfCredential(string identity, string domain, string hostname)
{
if (identity == "tester" && domain == "test" && hostname == "localhost")
return new byte[] { 1, 2, 3, 4, 5 };
else
return null;
}
public override (string, byte[]) GetSelfIdentityAndCredential(string domain, string hostname)
{
if (domain == "test" && hostname == "localhost")
return ("tester", new byte[] { 1, 2, 3, 4, 5 });
else
return (null, null);
}
public override AsyncReply<bool> Login(Session session)
{
return base.Login(session);
}
public override AsyncReply<bool> Logout(Session session)
{
return base.Logout(session);
}
}
}
+7 -5
View File
@@ -49,6 +49,7 @@ using Esiur.Security.Membership;
using Esiur.Net.Packets; using Esiur.Net.Packets;
using System.Numerics; using System.Numerics;
using Esiur.Protocol; using Esiur.Protocol;
using Esiur.Security.Authority.Providers;
namespace Esiur.Tests.Functional; namespace Esiur.Tests.Functional;
@@ -142,12 +143,12 @@ class Program
//}); //});
var wh = new Warehouse(); var wh = new Warehouse();
wh.RegisterAuthenticationProvider(new ServerAuthenticationProvider());
// Create stores to keep objects. // Create stores to keep objects.
var system = await wh.Put("sys", new MemoryStore()); var system = await wh.Put("sys", new MemoryStore());
var server = await wh.Put("sys/server", new EpServer() { var server = await wh.Put("sys/server", new EpServer() {
AllowedAuthenticationProviders = new string[] { "hash" },
// Membership = membership
}); });
@@ -213,13 +214,14 @@ class Program
private static async void TestClient(IResource local) private static async void TestClient(IResource local)
{ {
var wh = new Warehouse();
var auth = new ClientAuthenticationProvider();
wh.RegisterAuthenticationProvider(auth);
var con = await new Warehouse().Get<EpConnection>("EP://localhost", new EpConnectionContext var con = await new Warehouse().Get<EpConnection>("EP://localhost", new EpConnectionContext
{ {
AutoReconnect = true, AutoReconnect = true,
//Username = "admin", Identity = "tester",
//Password = "admin",
Identity = "demo",
AuthenticationProtocol = "hash" AuthenticationProtocol = "hash"
}); });
@@ -0,0 +1,40 @@
using Esiur.Core;
using Esiur.Security.Authority;
using Esiur.Security.Authority.Providers;
using System;
using System.Collections.Generic;
using System.Text;
namespace Esiur.Tests.Functional
{
internal class ServerAuthenticationProvider: PasswordAuthenticationProvider
{
public override (byte[], byte[]) GetHostedAccountCredential(string identity, string domain)
{
if (identity == "tester" && domain == "test")
return (new byte[] { 1, 2, 3, 4, 5 }, new byte[] { 6, 7, 8, 9, 10 });
else
return (null, null);
}
public override byte[] GetSelfCredential(string identity, string domain, string hostname)
{
return base.GetSelfCredential(identity, domain, hostname);
}
public override (string, byte[]) GetSelfIdentityAndCredential(string domain, string hostname)
{
return base.GetSelfIdentityAndCredential(domain, hostname);
}
public override AsyncReply<bool> Login(Session session)
{
return base.Login(session);
}
public override AsyncReply<bool> Logout(Session session)
{
return base.Logout(session);
}
}
}