Як реалізувати сервер oauth2 в ASP.NET MVC 5 та WEB API 2 [закрито]


127

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

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

Мені важко знайти підручники, путівники чи пояснення з цього приводу. Я розумію OAuth2 і що потрібно зробити, але я ніколи раніше не робив подібного і мені важко почати. Найближче до того, що мені потрібно, що я знайшов - це посилання github repo , але рішення не створюється .

Що я мав на увазі, це зробити веб-сайт ASP.NET MVC, де клієнти (треті сторони) можуть зареєструватися та придбати ідентифікатор клієнта. За допомогою API ASP.NET я хотів створити API, який приймає необхідні маркери та параметри, а потім отримати доступ до служб Dyn AX.

Це правильно чи я цілком помиляюся? Будь-яка допомога або посилання щодо створення власного сервера / сервісу oauth2 було б непогано.


Відповіді:


189

Я погляну на це, але з назви глав я думаю, що це знову не те, що я шукаю, оскільки він зосереджується на постачальниках особистих даних ідентичності для входу в facebook / google.
Робін

3
Тільки частина 4 стосується facebook та google. Я реалізував власний контролер аутентифікації на основі цих навчальних посібників два місяці тому. І я також використовував власну базу даних користувачів.
MichaelS

1
У мене є ще одне питання: де зберігаються ці жетони? Чи особистість цілком піклується про це?
Робін

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

Потім створіть файл HTML і JavaScript ( index.js) з цим вмістом:

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 та видачі маркера. Дуже хороша. Дякуємо також за публікацію у вашому блозі.
черв'як

@Kai - Де Microsoft ASP.NET Identity Owinграє? Чи використовуєте ви ідентифікацію ASP.NET для автентифікації користувача? Якщо ні, чи потрібен цей пакет NuGet?
черв'як

1
@webworm - Лінія app.UseOAuthBearerTokens(OAuthOptions);не буде працювати без Microsoft ASP.NET Identity Owin. Він не розпізнає метод UseOAuthBearerTokens.
Кай Хартманн

відсутній пакет: Microsoft.Owin.Host.SystemWeb, Microsoft ASP.NET Identity Owin
Muhammed Afsal

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
  • Клацніть на Повноважні дані
  • Клацніть Створити облікові дані та виберіть OAuth Client
  • Виберіть веб-додаток як тип програми та введіть ім'я-> введіть авторизовану 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ідентифікатором.
  • Клацніть регістр, щоб зареєструвати Gmailідентифікатор у базі даних додатків.
  • Ви побачите, що дані про особу відображаються вгорі як звичайна реєстрація
  • Спробуйте вийти та знову увійти через Gmail. Це автоматично введе вас у додаток.

15
Користувач прямо заявляє, що не хоче використовувати логіни Facebook або Gmail.
Барто Бернсманн

Я не вважаю за необхідне спростовувати цю відповідь. Оцінки на верхній коментар достатньо. Ця відповідь містить корисну інформацію, і відповідь витратив реальні творчі зусилля для надання зазначеної інформації. Why punish that effort? Можливо, ТАК потребує способу позначити відповідь як неправильну відповідь на питання ОП. Або дозволити користувачам запропонувати перейти на більш відповідне питання ... або створити нове запитання з відповіді.
Вальтер Стабош
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.