Properties and on change events So I made a socket communication library. And a part of it is IConnection 

public enum ConnectionState
{
    NotConnected, Connecting, Connected, Authenticated, Disconnecting, Disconnected
}

public interface IConnection
{
    ConnectionState State { get; }

    event Action Connected;
    event Action Disconnected;
    event Action Authenticated;
    event Action AuthenticationFailed;

    // this two methods are the core of my question
    void OnAuthenticated();
    void OnAuthenticationFailed();

    bool Send(byte[] data);
    void Connect();
    void Close();
}


Of course IConnection provides information about connection state and is able to fire Connected/Disconnected events as it holds Socket. There is no doubt.

Now, users of IConnection would also like to know when it becomes authenticated. For example, server might listen to that events, and once connection is authenticated - send client's initial configuration data. Or client might listen to that events and decide to start communication or retry authentication process.

But. The problem is, authentication process exists in the protocol layer. IConnection has no idea such layer even exists. Protocol layer actually uses IConnection to send serialized to byte[] message to the other party. And for this one particular message kind, protocol layer is able to send data upon connection in ConnectionState.Connected state.

So, for IConnection to be able to change it's state and inform subscribers on auth process i had to implement this two methods

void OnAuthenticated();
void OnAuthenticationFailed();


Which are, obviously called from protocol layer authentication process code.

I feel like I'm doing something wrong here. And since i work alone, any thoughts will be much appreciated.
You're not quite correct saying that IConnection has no ideas about protocol layer - in your defininition IConnection provides events about authentication process. So your code should have some connections between IConnection and protocol layer. I have no clue about entire relationships between layers in your application, but I can suggest some method:


provide function for calling events (like you suggested) 
implement IConnection in protocol layer 
realization of IConnection listens what happens in protocol layer (i.e. AssignAuthentificationService function)
implement IAuthentifiedConnection that knows about protocol layer