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.)

Foi útil?

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":

Então, você precisa saber de onde vêm os conjuntos de reivindicações:

Armado com esse conhecimento, na verdade se torna bastante simples.

Se eu entendi corretamente, o fluxo de trabalho básico seria algo assim:

  1. O cliente cria um SecurityToken usando um SecurityTokenProvider
  2. Cliente serializa o SecurityToken usando um SecurityTokenSerializer
  3. Servidor desaperializa o SecurityToken usando um SecurityTokenSerializer
  4. O servidor cria IAuthorizationPolicys usando a SecurityTokenAuthenticator
  5. O servidor cria AuthorizationContext a partir de IAuthorizationPolicys
  6. 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 X509SecurityTokens usa a X509SecurityTokenProvider/Authenticator. Por WindowsSecurityTokenS 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 UserNameSecurityTokenareia X509SecurityTokenS funciona como um charme (não tentei deserialização), mas WindowsSecurityTokenAparentemente, 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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top