Я не думаю, что с этим подходом что-то не так, если этот сервис используется в среде, где вы можете контролировать распространение сертификатов и обеспечивать их безопасное хранение.
Предполагая, что это WCFсервис, вы можете получить сертификат, который клиент представляет, используя класс, который наследуется от ServiceAuthorizationManager
.Примерно так будет работать:
public class CertificateAuthorizationManager : ServiceAuthorizationManager
{
protected override bool CheckAccessCore(OperationContext operationContext)
{
if (!base.CheckAccessCore(operationContext))
{
return false;
}
string thumbprint = GetCertificateThumbprint(operationContext);
// TODO: Check the thumbprint against your database, then return true if found, otherwise false
}
private string GetCertificateThumbprint(OperationContext operationContext)
{
foreach (var claimSet in operationContext.ServiceSecurityContext.AuthorizationContext.ClaimSets)
{
foreach (Claim claim in claimSet.FindClaims(ClaimTypes.Thumbprint, Rights.Identity))
{
string tb = BitConverter.ToString((byte[])claim.Resource);
tb = tb.Replace("-", "");
return tb;
}
}
throw new System.Security.SecurityException("No client certificate found");
}
}
Затем вам нужно изменить конфигурацию на сервере, чтобы использовать этот менеджер авторизации:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="MyServerBehavior">
<serviceAuthorization serviceAuthorizationManagerType="myNamespace.CertificateAuthorizationManager, myAssembly"/>
...
</behavior>
</serviceBehaviors>
</behaviors>
...
</system.serviceModel>