Как реализовать сервер oauth2 в ASP.NET MVC 5 и WEB API 2

Сначала я нарисую свой проект:

Для моего внутреннего корабля мне нужно добавить функциональность к существующей системе. Сторонний клиент должен иметь возможность получать доступ к данным из веб-сервисов AX после авторизации пользователем через oauth2. Я понимаю, что мне нужно сделать "прокси-веб-сервис", где клиент может совершать свои звонки, и это вызывает службы AX, но я немного не уверен в части oauth2. Большинство руководств и руководств посвящены использованию идентификатора ASP.NET для входа в facebook или google. Мне это не нужно, мне нужно использовать существующие учетные данные, поэтому мне нужно сделать свою собственную услугу oauth2.

Мне сложно найти учебники, руководства или объяснения по этому вопросу. Я понимаю oauth2 и что нужно сделать, но я никогда не делал такого раньше, и мне было тяжело начинать. Самое близкое к тому, что мне нужно, что я нашел, это ссылка github repo, но решение не создается.

Я имел в виду создание веб-сайта ASP.NET MVC, где клиенты (третьи стороны) могут регистрироваться и приобретать свои идентификаторы клиентов. С ASP.NET API я хотел создать API, который принимает необходимые маркеры и параметры, а затем получить доступ к службам Dyn AX.

Является ли это правильным или я совершенно неправ? Любая помощь или ссылки на создание собственного сервера/службы oauth2 были бы приятными.

Ответ 1

Существует блестящее сообщение в блоге Taiseer Joudeh с подробным пошаговым описанием.

Ответ 2

Я также пытался найти статьи о том, как просто генерировать часть токенов. Я никогда не нашел его и написал сам. Поэтому, если это помогает:

Что делать:

  • Создание нового веб-приложения
  • Установите следующие пакеты NuGet:
    • Microsoft.Owin
    • Microsoft.Owin.Host.SystemWeb
    • Microsoft.Owin.Security.OAuth
    • Microsoft.AspNet.Identity.Owin
  • Добавить класс OWIN startup

Затем создайте HTML и файл JavaScript (index.js) с этим содержимым:

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>

Класс OWIN startup должен иметь этот контент:

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);
        }
    }
}

Запустите проект. Маркер должен отображаться во всплывающем окне.

Ответ 3

Я изучаю то же самое и наткнулся на identityserver, который реализует OAuth и OpenID поверх ASP.NET. Он интегрируется с идентификатором ASP.NET и Членство Перезагрузка с сохранением поддержка Entity Framework.

Итак, чтобы ответить на ваш вопрос, ознакомьтесь с подробным документом как настроить сервер OAuth и OpenID.

Ответ 4

Gmail: OAuth

  • Перейти к ссылке
  • Войти с вашим именем пользователя gmail
  • Нажмите на меню google в левом верхнем углу
  • Нажмите "Диспетчер API"
  • Нажмите "Credentials"
  • Нажмите "Создать учетные данные" и выберите "Клиент OAuth"
  • Выберите "Веб-приложение как тип приложения" и введите "Имя" > "Авторизованный URL-адрес переадресации" (например: http://localhost:53922/signin-google) → Нажмите "Создать" кнопка. Это создаст учетные данные. Pls делает запись Client ID и Secret ID. Наконец, нажмите "ОК", чтобы закрыть учетные данные.
  • Следующий важный шаг - включить Google API. Нажмите "Обзор" на левой панели.
  • Нажмите Google API в разделе "Социальные API".
  • Нажмите "Включить".

Все это из части Google.

Вернитесь в свое приложение, откройте App_start/Startup.Auth.cs и раскомментируйте следующий фрагмент

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

Обновите теги ClientId и ClientSecret со значениями из Google API учетных данных, которые вы уже создали.

  • Запустите приложение
  • Нажмите "Вход"
  • Вы увидите кнопку Google в разделе "Использовать другую секцию для входа в раздел
  • Нажмите кнопку Google
  • Приложение предложит вам ввести имя пользователя и пароль
  • Введите имя пользователя и пароль gmail и нажмите "Войти"
  • Это выполнит OAuth и вернется к вашему приложению и предложит вам зарегистрироваться с идентификатором Gmail.
  • Нажмите регистратор, чтобы зарегистрировать id Gmail в своей базе данных приложений.
  • Вы увидите, что данные Identity отображаются сверху, как обычная регистрация.
  • Попробуйте выйти и войти снова через Gmail. Это автоматически войдет в приложение.