Il mutuo TLS (ovvero l'autenticazione client) è una soluzione a questo.
Per quanto riguarda l'emissione di certificati, non lo farei. Prendevo i certificati autofirmati dal client e li collegavo direttamente ai principal (utenti) in qualche modo. Avrei una tabella di ricerca indicizzata dal nome comune e dalla chiave pubblica del certificato per farlo. Ciò rende molto più facili problemi come la revoca di certificati (eliminare la riga) e la compromissione di CA (nessuno coinvolto).
In alternativa puoi richiedere i CSR dai clienti e firmarli utilizzando una CA di cui ti fidi (una terza parte o la tua CA interna se la tua organizzazione ha le competenze e le risorse per proteggerla correttamente).
Ecco una buona descrizione di alto livello di The Code Project e hanno codice di esempio .NET che lo dimostra:
Mutual SSL authentication or certificate based mutual authentication
refers to two parties authenticating each other through verifying the
provided digital certificate so that both parties are assured of the
others' identity. In technology terms, it refers to a client (web
browser or client application) authenticating themselves to a server
(website or server application) and that server also authenticating
itself to the client through verifying the public key
certificate/digital certificate issued by the trusted Certificate
Authorities (CAs). Because authentication relies on digital
certificates, certification authorities such as Verisign or Microsoft
Certificate Server are an important part of the mutual authentication
process. From a high-level point of view, the process of
authenticating and establishing an encrypted channel using
certificate-based mutual authentication involves the following steps:
- A client requests access to a protected resource.
- The server presents its certificate to the client.
- The client verifies the server’s certificate.
- If successful, the client sends its certificate to the server.
- The server verifies the client’s credentials.
- If successful, the server grants access to the protected resource requested by the client.
SOURCE: link