Como usar o System.IdentityModel no próprio aplicativo cliente-servidor
-
22-07-2019 - |
Pergunta
Eu tenho um aplicativo cliente-servidor simples com base no TCPCLIENT/TCPListener e SSLStream. Os clientes podem se autenticar para o servidor usando um X509Certificate ou enviando um nome de usuário e senha após a criação do SSLStream.
WCF faz uso do System.IdentityModel espaço para nome para fins de autenticação, mas aparentemente Isso pode ser usado em aplicações arbitrárias-que parece interessante. As informações sobre como fazer isso são escassas (ou meu Google Foo está fraco hoje).
Então, minha pergunta é: O que preciso fazer para integrar o System.IdentityModel ao meu aplicativo? Não tenho certeza se preciso de todas essas coisas de reivindicação, mas seria bom se os usuários pudessem fazer login apenas usando a conta do Windows ou qualquer outro mecanismo de autenticação fornecido. (Infelizmente, não posso simplesmente mudar para o WCF, mas tenho que usar o protocolo personalizado, embora eu possa fazer algumas alterações, se necessário.)
Solução
Meu Google Foo era realmente fraco. A resposta está logo atrás do link na minha pergunta. Então, aqui estão alguns links para este blog Caso alguém tenha a mesma pergunta eventualmente.
Primeiro, você deve tentar entender "esse conjunto de reclamações":
- Reivindicações
- Conjuntos de reivindicações
- Inspecionar conjuntos de reivindicações
- Conjuntos de reivindicações Windows e X509Certificate
- Operações típicas em conjuntos de reivindicações
Então, você precisa saber de onde vêm os conjuntos de reivindicações:
- Políticas de autorização, transformação de contexto e reivindicações
- Transformação de reivindicações no WCF
- O contexto de autorização e a transformação de reivindicações fora do WCF
Armado com esse conhecimento, na verdade se torna bastante simples.
Se eu entendi corretamente, o fluxo de trabalho básico seria algo assim:
- O cliente cria um
SecurityToken
usando umSecurityTokenProvider
- Cliente serializa o
SecurityToken
usando umSecurityTokenSerializer
- Servidor desaperializa o
SecurityToken
usando umSecurityTokenSerializer
- O servidor cria
IAuthorizationPolicy
s usando aSecurityTokenAuthenticator
- O servidor cria
AuthorizationContext
a partir deIAuthorizationPolicy
s - Feito
Exemplo:
// Create the SecurityTokenProvider
var p = new UserNameSecurityTokenProvider("username", "password");
// Get the SecurityToken from the SecurityTokenProvider
var t = p.GetToken(TimeSpan.FromSeconds(1.0)) as UserNameSecurityToken;
// ... transmit SecurityToken to server ...
// Create the SecurityTokenAuthenticator
var a = new CustomUserNameSecurityTokenAuthenticator(
UserNamePasswordValidator.None);
// Create IAuthorizationPolicies from SecurityToken
var i = a.ValidateToken(t);
// Create AuthorizationContext from IAuthorizationPolicies
var c = AuthorizationContext.CreateDefaultAuthorizationContext(i);
ShowClaims(c.ClaimSets);
Por X509SecurityToken
s usa a X509SecurityTokenProvider
/Authenticator
. Por WindowsSecurityToken
S tem um WindowsSecurityTokenAuthenticator
mas não um provedor; Em vez disso, use o WindowsSecurityToken
construtor:
var t = new WindowsSecurityToken(WindowsIdentity.GetCurrent());
Isso funciona muito bem. A única coisa que omiti tão acima é a serialização do token. Existe um SecurityTokenSerializer
classe que tem uma implementação na estrutura .NET: o WSSecurityTokenSerializer
classe que vem com o WCF.
Serializando UserNameSecurityToken
areia X509SecurityToken
S funciona como um charme (não tentei deserialização), mas WindowsSecurityToken
Aparentemente, S não é suportado pelo serializador. Isso me deixa com os dois métodos de autenticação que eu já tenho (certificados e nome de usuário/senha) e, como eu não queria isso AuthorizationContext
Enfim, vou ficar com o que tenho :)
Outras dicas
Não tenho a reputação de postar um comentário na solução existente, mas gostaria de postar os novos URLs nos blogs listados na solução, pois eles não funcionam mais. Se alguém puder mudar isso para um comentário, eu seria muito obrigado.
- Reivindicações
- Conjuntos de reivindicações
- Inspecionar conjuntos de reivindicações
- Conjuntos de reivindicações de certificado Windows e X509
- Operações típicas em conjuntos de reivindicações
- Políticas de autorização, transformação de contexto e reivindicações
- Transformação de reivindicações no WCF
- O contexto de autorização e a transformação de reivindicações fora do WCF