Login AD .Net Core API (ERR_SSL_PROTOCOL_ERROR)

25 respostas
.netservidorapiprogramaçãowebservice
G

Estou com um problema quando tento fazer uma chamada na minha API que me fornece os dados de quem está conectado no AD essa minha API está no servidor IIS e me trás esse erro: ( Não foi possível estabelecer uma conexão segura com este site ERR_SSL_PROTOCOL_ERROR). Alguém saberia me dizer o motivo desse erro? Teria alguma coisa haver com a conexão direto no AD?

25 Respostas

G

Possivelmente, sua maquina não confia no certificado de desenvolvimento do .Net Core SDK.
Esse comando, deve resolver:
dotnet dev-certs https --trust

G

Edit.
Continua o mesmo erro de SSL, em localhost eu consigo pegar mas na minha rede de DEV não

G

Ao publicar, você instalou um certificado no IIS?

Essa doc da Microsoft ensina a gerar um certificado auto-assinado e adiciona-lo ao IIS:
https://support.microsoft.com/pt-br/help/228991/how-to-create-and-install-an-ssl-certificate-in-internet-information-s

Se você está rodando no IIS Express em modo debug, sugiro que faça uma publicação no IIS Local, gere e instale o certificado no IIS Local e refaça o teste.

G

Funcionou esse certificado, porém eu rodei a DLL no CLI do dotNet e ele me trouxe esse erro :
# Connection id "0HLF65M4A0D4I", Request id "0HLF65M4A0D4I:0000000E": An unhandled exception was thrown by the application
Seria algo relacionado com a minha controler?

[Route("api/[controller]")]
    [ApiController]
    [EnableCors("CorsPolicy")]
    [Authorize]
    public class ValuesController : ControllerBase
    {
        // GET api/login
        [HttpGet]
        public IActionResult IISAuthorize()
        {
            var name = HttpContext.User.Claims.FirstOrDefault(p => p.Type == ClaimTypes.Name)?.Value;
            return new ContentResult() { Content = $@"{name.ToUpper()}" };
        }
G

Teria algum outro jeito de eu pegar somente o dominio e o nome do usuario? Quando eu pego na rede ele não me trás quem está logado

G

Precisa ver o Stacktrace no momento da execução. A CLI mostrou apenas essa mensagem, nada mais?

G

Desculpe-me, não entendi sua pergunta. Poderia explicar melhor ?

G

Eu tenho uma api que pega o nome e dominio de quem está logado, porém quando eu subo ela no servidor, ela me trás o nome do servidor e da API, só consigo pegar o usuário logado em LocalHost

G

Isso me leva a crer que você está recuperando os dados do usuário que está logado no computador/servidor e não na sua API…

Você pode mostrar o trecho do código que retorna essa informação?

G
[HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
         string UserName = System.Environment.UserName;
         string UserDomainName = System.Environment.UserDomainName;
        return new string[] { UserName, UserDomainName };
    }

Meu código é bem simples, como pode ver.
Coloquei como:
“windowsAuthentication”: true,
“anonymousAuthentication”: false,

G

Como imaginei, na realidade você está retornando o usuário que está logado na maquina em questão.

Como você está controlando o processo de login na sua API? Pq não devolve um token JWT ao realizar o login e então verifica se a pessoa está logada, se possui autorização(roles) e os dados(tipo o nome de usuário e/ou nome) através do Token, que será enviado no cabeçalho das requisições?

G

Eu sou novo em DotNet por isso eu não manjo muito dessas autenticações, o meu front está em React.js, o usuáro não possuirá uma tela de login, ele irá conectar direto pelo AD.
Mesmo assim, muito obrigado pela ajuda! Eu tentarei fazer isso!! Boa!

G

Ah sim, dê uma olhada nesses link’s acho que poderão lhe ajudar.

Boa sorte!

G

Esse do Medium eu fiz igual porém no Servidor IIS ele dá um erro 500, não consigo acessar o método, aí que dá aquele erro que mencionei lá em cima “Connection id “0HLF65M4A0D4I”, Request id “0HLF65M4A0D4I:0000000E”: An unhandled exception was thrown by the application”, mas em localhost ele funciona certinho.

Vou seguir esse outro tutorial da balta.io, novamente muito obrigado!

G

Essa foi a unica mensagem que apareceu? Não apareceram mais coisas embaixo? Acho que deveria ser +/- assim:

Connection id 0HLF65M4A0D4I, Request id 0HLF65M4A0D4I:0000000E: An unhandled exception was thrown by the application
    System.ArgumentNullException: Value cannot be null.
    Parameter name: XYZABC
...
G

Isso, tinha mais coisas, achei que não fosse tão importante… ksk

G

Geralmente, essas coisas a mais são as que nos dizem a causa do problema kkk… Você poderia enviar para eu dar uma olhada?

G
Microsoft.AspNetCore.Server.Kestrel[13]
Connection id "0HLULEUJ5EHIT", Request id "0HLULEUJ5EHIT:00000001": An andled exception was thrown by the application. 
Systen.InvalidOperationException: No authenticationScheme was specified, an are was no DefaultChallegeScheme found.
at Microsoft.AspNetCore.Authentication.AuthenticationService.ChallengeAsync httpContext context. String scheme, AuthenticationProperties properties.

Talvez tenham alguns erros de escrita porque eu tive que digitar, isso está na minha máquina do serviço eu só tinha a foto…

G

Sem problemas…

No método ConfigureServices da classe Startup.cs adicione a linha services.AddAuthentication(IISDefaults.AuthenticationScheme);
e no método Configure adicione app.UseAuthentication();

Acho que isso deve resolver.

G

Irei tentar assim que eu entrar no serviço amanhã! Você é um gênio kk muito obrigado!

G

Tive um progresso, porém eu busco a API e ele me retorna “IIS APPPOOL\nome da minha API”

G

Pfvr, mostre-me o código do controlador que está retornando isso.

G

Bom dia, estou tentando da seguinte forma

[Route("autorizar")]
        [HttpGet]
        public IActionResult IISAuthorize()
        {
           
            var name = HttpContext.User.Claims.FirstOrDefault(p => p.Type == ClaimTypes.Name)?.Value;
            return new ContentResult() { Content = $@"{ name }" };
        }
        // GET api/values/
        [HttpGet]
        public ActionResult<IEnumerable<string>>  Get()
        {
          
            string User = System.Security.Principal.WindowsIdentity.GetCurrent().Name;

            return new string[] { User };
        }
G

Bem, isso também retorna o usuario atual do Windows :slight_smile:

Vamos lá, esse tipo de autenticação que você está buscando se chama NTLM e consiste em você informar um Usuário e Senha e seu sistema negociar com o Active Directory para saber se essas credenciais são validas ou não.
Você NÃO estará de fato fazendo um login em um maquina Windows, apenas pedirá ao seu AD que verifique se essas credenciais são validas. Portanto, métodos como System.Security.Principal.WindowsIdentity.GetCurrent() e/ou System.Environment.UserName não irão te retornar o que você deseja.

Então como vou saber quem está fazendo essa requisição?

Uma API que use autenticação/autorização não é como um site web, que você faz login uma vez e não precisa se identificar a cada operação que realiza. Para cada requisição que você fizer na sua API, você precisa dizer a ela quem está fazendo.
Existem muitas formas de dizer a uma API quem é que está fazendo essa operação, acredito que hoje a forma mais conhecida e utilizada seja através de um Token JWT, mas como você provavelmente está em um ambiente interno e controlado, talvez enviar esse usuário e senha em toda requisição em um cabeçalho de autenticação seja a opção mais simples de se implementar.
E ai sim, quando o fulano for fazer alguma operação você conseguirá identifica-lo através do Token JWT/Informações enviadas no cabeçalho de autorização.

G

Muito obrigado pela explicação. Irei aplicar o JWT para fazer isso!!

Criado 30 de março de 2020
Ultima resposta 2 de abr. de 2020
Respostas 25
Participantes 2