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


127

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

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

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

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

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


Ответы:


189

Я посмотрю на это, но, судя по названиям глав, я думаю, что это снова не то, что я ищу, поскольку он фокусируется на поставщиках удостоверений личности и facebook / google.
Робин

3
Только часть 4 посвящена facebook и google. Два месяца назад я реализовал свой собственный контроллер аутентификации на основе этих руководств. И я тоже использовал свою базу данных пользователей.
MichaelS

1
У меня еще один вопрос, где хранятся эти токены? Об этом позаботится Identity?
Робин

17
@MichaelS спасибо за ссылку на мои сообщения в блоге, рад, что это было полезно для вашего проекта :)
Taiseer Joudeh

@MichaelS Я сомневался, что способ аутентификации на основе токенов является достаточной безопасностью для остальных api. потому что, если я могу получить токен пользователя в его браузере. Думаю, этого можно добиться, потому что токен хранится в заголовке запроса Authentication. Я могу делать все, что хочу, например, получать / размещать / помещать / удалять.
Joe.wang

87

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

Что нужно сделать:

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

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

var loginData = 'grant_type=password&username=test.test@mail.com&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 == "test.test@mail.com" && context.Password == "test123")
                        {
                            ClaimsIdentity oAuthIdentity = new ClaimsIdentity(context.Options.AuthenticationType);
                            context.Validated(oAuthIdentity);
                        }
                    }
                },
                AllowInsecureHttp = true,
                AccessTokenExpireTimeSpan = TimeSpan.FromDays(1)
            };

            app.UseOAuthBearerTokens(OAuthOptions);
        }
    }
}

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


5
Мне очень нравится, что вы не добавили ASP Identity или Entity Framework. В большинстве статей, которые я видел, они интегрируются с решением OAuth. Ваше решение ориентировано на OAuth и выпуск токена. Очень хорошо. Спасибо также за публикацию в вашем блоге.
webworm

@Kai - Где тут Microsoft ASP.NET Identity Owinв игру вступает? Вы используете ASP.NET Identity для аутентификации пользователя? Если нет, нужен ли этот пакет NuGet?
webworm

1
@webworm - линия не app.UseOAuthBearerTokens(OAuthOptions);будет работать без Microsoft ASP.NET Identity Owin. Он не распознает метод UseOAuthBearerTokens.
Кай Хартманн,

отсутствует пакет: Microsoft.Owin.Host.SystemWeb, Microsoft ASP.NET Identity Owin
Мухаммед Афсал

3
Я просто хочу добавить одну вещь, например, если вы тоже получаете ошибку неверной сборки Newtonsoft.Json (в .NET 4.6 и выше), обновите Newtonsoft.Json до версии 11 или выше.
vibs2006

4

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

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


-12

Gmail: OAuth

  • Перейти по ссылке
  • Войдите в систему с вашим паролем имени пользователя Gmail
  • Нажмите на меню Google в левом верхнем углу.
  • Нажмите API Manager
  • Нажмите на учетные данные
  • Нажмите «Создать учетные данные» и выберите «Клиент OAuth».
  • Выберите веб-приложение в качестве типа приложения и введите имя -> введите URL авторизованного перенаправления (например, http: // localhost: 53922 / signin-google ) -> нажмите кнопку «Создать». Это создаст учетные данные. Пожалуйста, обратите внимание на Client IDи Secret ID. Наконец, нажмите OK, чтобы закрыть всплывающее окно учетных данных.
  • Следующим важным шагом является включение 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идентификатором.
  • Нажмите «Зарегистрироваться», чтобы зарегистрировать Gmailидентификатор в базе данных вашего приложения.
  • Вы увидите, что данные личности отображаются вверху как обычная регистрация.
  • Попробуйте выйти и снова войти в систему через Gmail. Это автоматически выполнит вход в приложение.

15
Пользователь прямо заявляет, что не хочет использовать логины Facebook или Gmail.
Барто Бернсманн

Я не думаю, что нужно отрицать этот ответ. Достаточно проголосовать за верхний комментарий. Этот ответ содержит полезную информацию, и ответчик приложил реальные творческие усилия, чтобы предоставить указанную информацию. Why punish that effort? Возможно, SO нужен способ пометить ответ как несоответствующий вопросу OP. Или позволить пользователям предлагать переместить его к более подходящему вопросу ... или создать новый вопрос на основе ответа.
Вальтер Стабош
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.