Como implementar o servidor oauth2 no ASP.NET MVC 5 e na WEB API 2 [fechado]

127

Primeiro vou esboçar meu projeto:

Para o meu estágio, preciso adicionar funcionalidade a um sistema existente. Um cliente de terceiros deve poder acessar dados dos serviços da Web do AX depois de autorizado pelo usuário pelo OAuth2. Entendo que preciso criar um 'serviço da Web proxy' para que o cliente possa fazer suas chamadas e que chame os serviços do AX, mas estou um pouco inseguro sobre a parte do OAuth2. A maioria dos tutoriais e guias trata do uso do Identity do ASP.NET para logins do Facebook ou do Google. Não preciso disso, preciso usar credenciais existentes, portanto, preciso criar meu próprio serviço OAuth2.

Acho difícil encontrar tutoriais, guias ou explicações sobre isso. Entendo o OAuth2 e o que precisa ser feito, mas nunca fiz isso antes e acho difícil começar. A coisa mais próxima do que eu preciso é que encontrei esse link de repositório do github , mas a solução não foi criada.

O que eu tinha em mente era criar um site ASP.NET MVC onde clientes (terceiros) podem se registrar e adquirir seus IDs de cliente. Com a API do ASP.NET, eu queria criar a API que usasse os tokens e parâmetros necessários e, em seguida, acesse os serviços do Dyn AX.

Isso está correto ou estou totalmente errado? Qualquer ajuda ou link sobre a criação de seu próprio servidor / serviço oauth2 seria bom.

Robin
fonte

Respostas:

189

Há um brilhante post no blog de Taiseer Joudeh com uma descrição detalhada passo a passo.

  1. Parte 1: autenticação baseada em token usando a API da Web do ASP.NET 2, Owin e identidade
  2. Parte 2: Autenticação de token AngularJS usando a API da Web do ASP.NET 2, Owin e Identity
  3. Parte 3: Habilitar tokens de atualização do OAuth no aplicativo AngularJS usando a API da Web .NET ASP 2 e Owin
  4. Parte 4: logins externos da API da Web do ASP.NET 2 com o Facebook e o Google no aplicativo AngularJS
  5. Parte 5: dissociar o servidor de autorização OWIN do Resource Server
MichaelS
fonte
Vou olhar é, mas a partir dos nomes dos capítulos, acho que não é mais o que procuro, pois se concentra nos provedores de identidade e de login no facebook / google.
Robin
3
Somente a parte 4 é sobre facebook e google. Eu implementei meu próprio controlador de autenticação com base nesses tutoriais há dois meses. E eu também estava usando meu próprio banco de dados de usuários.
precisa
1
Tenho mais uma pergunta: onde esses tokens são armazenados? A Identity cuida disso inteiramente?
Robin
17
@MichaelS graças para se referir aos meus posts, feliz por ter sido útil para o seu projeto :)
Taiseer Joudeh
@MichaelS Eu duvidava que o modo de autenticação baseada em token fosse segurança suficiente para o resto da API. porque se eu conseguir o token do usuário em seu navegador. Eu acho que isso pode ser alcançado porque o token é armazenado no cabeçalho da solicitação Authentication. Eu posso fazer tudo o que eu quero, como obter / postar / colocar / excluir.
Joe.wang
87

Também lutei para encontrar artigos sobre como gerar apenas a parte do token. Eu nunca encontrei um e escrevi o meu. Então, se ajudar:

As coisas a fazer são:

  • Crie um novo aplicativo da web
  • Instale os seguintes pacotes NuGet:
    • Microsoft.Owin
    • Microsoft.Owin.Host.SystemWeb
    • Microsoft.Owin.Security.OAuth
    • Microsoft.AspNet.Identity.Owin
  • Adicionar uma startupclasse OWIN

Em seguida, crie um index.jsarquivo HTML e JavaScript ( ) com este conteúdo:

var loginData = 'grant_type=password&[email protected]&password=test123';

var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function () {
    if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {
        alert(xmlhttp.responseText);
    }
}
xmlhttp.open("POST", "/token", true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.send(loginData);
<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <script type="text/javascript" src="index.js"></script>
</body>
</html>

A startupclasse OWIN deve ter este conteúdo:

using System;
using System.Security.Claims;
using Microsoft.Owin;
using Microsoft.Owin.Security.OAuth;
using OAuth20;
using Owin;

[assembly: OwinStartup(typeof(Startup))]

namespace OAuth20
{
    public class Startup
    {
        public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; }

        public void Configuration(IAppBuilder app)
        {
            OAuthOptions = new OAuthAuthorizationServerOptions()
            {
                TokenEndpointPath = new PathString("/token"),
                Provider = new OAuthAuthorizationServerProvider()
                {
                    OnValidateClientAuthentication = async (context) =>
                    {
                        context.Validated();
                    },
                    OnGrantResourceOwnerCredentials = async (context) =>
                    {
                        if (context.UserName == "[email protected]" && context.Password == "test123")
                        {
                            ClaimsIdentity oAuthIdentity = new ClaimsIdentity(context.Options.AuthenticationType);
                            context.Validated(oAuthIdentity);
                        }
                    }
                },
                AllowInsecureHttp = true,
                AccessTokenExpireTimeSpan = TimeSpan.FromDays(1)
            };

            app.UseOAuthBearerTokens(OAuthOptions);
        }
    }
}

Execute seu projeto. O token deve ser exibido no pop-up.

Kai Hartmann
fonte
5
Eu realmente gosto de como você não trouxe o ASP Identity ou Entity Framework. A maioria dos artigos que eu vi integrou esses itens à solução OAuth. Sua solução se concentra no OAuth e na emissão do token. Muito agradável. Obrigado também por postar em seu blog.
Webworm
@Kai - Onde Microsoft ASP.NET Identity Owinentra em jogo? Você está usando o ASP.NET Identity para autenticação do usuário? Caso contrário, este pacote NuGet ainda é necessário?
webworm
1
@webworm - A linha app.UseOAuthBearerTokens(OAuthOptions);não funcionará sem Microsoft ASP.NET Identity Owin. Não reconhece o método UseOAuthBearerTokens.
Kai Hartmann
pacote ausente: Microsoft.Owin.Host.SystemWeb, Microsoft ASP.NET Identity Owin
Muhammed
3
Eu só quero adicionar uma coisa, ou seja, se você também estiver recebendo um erro de montagem inválido do Newtonsoft.Json (no .NET 4.6 e superior), atualize o Newtonsoft.Json para a versão 11 ou superior.
vibs2006
-12

Gmail: OAuth

  • Ir para o link
  • Entre com sua senha de nome de usuário do gmail
  • Clique no menu do Google no canto superior esquerdo
  • Clique em API Manager
  • Clique em Credenciais
  • Clique em Criar credenciais e selecione Cliente OAuth
  • Selecione Aplicativo da Web como tipo de aplicativo e digite o Nome-> Digite o URL de redirecionamento autorizado (por exemplo: http: // localhost: 53922 / signin-google ) -> Clique no botão Criar. Isso criará as credenciais. Pls anote Client IDe Secret ID. Por fim, clique em OK para fechar as credenciais.
  • O próximo passo importante é ativar o Google API. Clique em Visão geral no painel esquerdo.
  • Clique na Google APIseção APIs sociais.
  • Clique em Ativar.

Isso é tudo da parte do Google.

Volte para o seu aplicativo, abra App_start/Startup.Auth.cse remova o comentário do seguinte trecho

        app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions()
        {
            ClientId = "",
            ClientSecret = ""
        });

Atualize os valores das credenciais que você já criou ClientIde ClientSecretcom os valores Google API.

  • Execute seu aplicativo
  • Clique em Login
  • Você verá o botão do Google na seção "Usar outra seção para fazer login"
  • Clique no botão do Google
  • O aplicativo solicitará que você digite o nome de usuário e a senha
  • Digite o nome de usuário e a senha do gmail e clique em Entrar
  • Isso executará o OAuth e retornará ao seu aplicativo, solicitando que você se registre com o GmailID.
  • Clique em registrar para registrar o GmailID no banco de dados do aplicativo.
  • Você verá os detalhes da identidade aparecerem na parte superior como registro normal
  • Tente sair e faça login novamente no Gmail. Isso fará o login automaticamente no aplicativo.
Ramachandran
fonte
15
O usuário afirma explicitamente que não deseja usar os logins do Facebook ou do Gmail.
Bartho Bernsmann
Não acho que seja necessário rebaixar esta resposta. Um voto positivo no comentário superior é suficiente. Esta resposta contém informações úteis e o respondente gastou um verdadeiro esforço criativo para fornecer essas informações. Why punish that effort? Talvez o SO precise de uma maneira de sinalizar uma resposta como desalinhada à pergunta do OP. Ou para permitir que os usuários sugiram que seja movido para uma pergunta mais apropriada ... ou para criar uma nova pergunta a partir da resposta.
Walter Stabosz