Jak zaimplementować serwer oauth2 w ASP.NET MVC 5 i WEB API 2 [zamknięte]


129

Najpierw naszkicuję mój projekt:

Podczas mojego stażu muszę dodać funkcjonalność do istniejącego systemu. Klient zewnętrzny musi mieć dostęp do danych z AX Webservices po autoryzacji przez użytkownika przez OAuth2. Rozumiem, że muszę utworzyć „usługę sieciową proxy”, w której klient może wykonywać swoje połączenia i która wywołuje usługi AX, ale nie jestem pewien co do części OAuth2. Większość samouczków i przewodników dotyczy korzystania z tożsamości ASP.NET dla logowania w serwisie Facebook lub Google. Nie potrzebuję tego, muszę użyć istniejących poświadczeń, więc muszę stworzyć własną usługę OAuth2.

Trudno jest znaleźć samouczki, przewodniki lub wyjaśnienia na ten temat. Rozumiem OAuth2 i rozumiem, co należy zrobić, ale nigdy wcześniej czegoś takiego nie robiłem i trudno jest mi zacząć. Najbliższą rzeczą, której potrzebuję, jest ten link repozytorium github , ale rozwiązanie się nie kompiluje.

Miałem na myśli stworzenie strony ASP.NET MVC, w której klienci (osoby trzecie) mogą się zarejestrować i uzyskać swoje ID klienta. Dzięki ASP.NET API chciałem stworzyć API, które pobierze wymagane tokeny i parametry, a następnie uzyska dostęp do usług Dyn AX.

Czy to prawda, czy całkowicie się mylę? Każda pomoc lub linki dotyczące budowania własnego serwera / usługi oauth2 byłyby miłe.


Odpowiedzi:


191

Spojrzę na to, ale z nazw rozdziałów myślę, że to znowu nie jest to, czego szukam, ponieważ koncentruje się na Tożsamości i dostawcach tożsamości logowania do Facebooka / Google.
Robin

3
Tylko część 4 dotyczy Facebooka i Google. Zaimplementowałem własny kontroler uwierzytelniania w oparciu o te samouczki dwa miesiące temu. Korzystałem też z własnej bazy danych użytkowników.
MichaelS

1
Mam jeszcze jedno pytanie, gdzie są przechowywane te tokeny? Czy Tożsamość całkowicie się tym zajmuje?
Robin

17
@MichaelS dzięki za odwołanie się do moich postów na blogu, cieszę się, że było to pomocne dla twojego projektu :)
Taiseer Joudeh

@MichaelS Wątpiłem, czy sposób uwierzytelniania opartego na tokenach jest wystarczającym zabezpieczeniem dla pozostałych api. bo jeśli mogę dostać token użytkownika w jego przeglądarce. Myślę, że można to osiągnąć, ponieważ token jest przechowywany w nagłówku żądania Authentication. Mogę zrobić wszystko, co chcę, na przykład dostać / opublikować / umieścić / usunąć.
Joe.wang

90

Miałem również problem ze znalezieniem artykułów o tym, jak po prostu wygenerować część tokena. Nigdy takiego nie znalazłem i nie napisałem własnego. Więc jeśli to pomoże:

Rzeczy do zrobienia to:

  • Utwórz nową aplikację internetową
  • Zainstaluj następujące pakiety NuGet:
    • Microsoft.Owin
    • Microsoft.Owin.Host.SystemWeb
    • Microsoft.Owin.Security.OAuth
    • Microsoft.AspNet.Identity.Owin
  • Dodaj startupklasę OWIN

Następnie utwórz plik HTML i JavaScript ( index.js) z następującą zawartością:

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>

startupKlasa OWIN powinna mieć następującą zawartość:

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

Uruchom swój projekt. Token powinien zostać wyświetlony w wyskakującym okienku.


5
Bardzo podoba mi się sposób, w jaki nie wprowadziłeś ASP Identity lub Entity Framework. Większość artykułów, które widziałem, integruje je z rozwiązaniem OAuth. Twoje rozwiązanie koncentruje się na OAuth i wydawaniu tokena. Bardzo dobrze. Dziękuję również za posty na swoim blogu.
robak internetowy

@Kai - Gdzie Microsoft ASP.NET Identity Owinwchodzi w grę? Czy używasz ASP.NET Identity do uwierzytelniania użytkowników? Jeśli nie, czy ten pakiet NuGet jest nadal potrzebny?
robak internetowy

1
@webworm - linia app.UseOAuthBearerTokens(OAuthOptions);nie będzie działać bez Microsoft ASP.NET Identity Owin. Nie rozpoznaje metody UseOAuthBearerTokens.
Kai Hartmann

brakujący pakiet: Microsoft.Owin.Host.SystemWeb, Microsoft ASP.NET Identity Owin
Muhammed Afsal

3
Chcę tylko dodać jedną rzecz, tj. Jeśli również otrzymujesz błąd nieprawidłowego zespołu Newtonsoft.Json (w .NET 4.6 i nowszych), zaktualizuj Newtonsoft.Json do wersji 11 lub nowszej.
vibs2006


-12

Gmail: OAuth

  • Przejdź do łącza
  • Zaloguj się za pomocą hasła do nazwy użytkownika Gmaila
  • Kliknij menu google w lewym górnym rogu
  • Kliknij Menedżer API
  • Kliknij Credentials
  • Kliknij Utwórz dane logowania i wybierz Klient OAuth
  • Wybierz aplikację internetową jako typ aplikacji i wprowadź nazwę-> wprowadź autoryzowany adres URL przekierowania (np .: http: // localhost: 53922 / signin-google ) -> kliknij przycisk Utwórz. Spowoduje to utworzenie poświadczeń. Pls zanotuj Client IDi Secret ID. Na koniec kliknij OK, aby zamknąć wyskakujące okienko poświadczeń.
  • Następnym ważnym krokiem jest włączenie Google API. Kliknij Przegląd w lewym okienku.
  • Kliknij Google APIsekcję pod Social APIs.
  • Kliknij opcję Włącz.

To wszystko od strony Google.

Wróć do swojej aplikacji, otwórz App_start/Startup.Auth.csi odkomentuj następujący fragment

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

Zaktualizuj ClientIdi ClientSecretwartościami z Google APIpoświadczeń, które już utworzyłeś.

  • Uruchom aplikację
  • Kliknij Login
  • Zobaczysz przycisk Google w sekcji „Użyj innej sekcji, aby się zalogować”
  • Kliknij przycisk Google
  • Aplikacja poprosi o wpisanie nazwy użytkownika i hasła
  • Wprowadź nazwę użytkownika i hasło do Gmaila, a następnie kliknij Zaloguj się
  • Spowoduje to wykonanie OAuth i powrót do aplikacji oraz monit o zarejestrowanie się przy użyciu Gmailidentyfikatora.
  • Kliknij zarejestruj, aby zarejestrować Gmailidentyfikator w bazie danych aplikacji.
  • Szczegóły tożsamości pojawią się u góry podczas normalnej rejestracji
  • Wyloguj się i zaloguj ponownie przez Gmaila. Spowoduje to automatyczne zalogowanie Cię do aplikacji.

15
Użytkownik wyraźnie oświadcza, że ​​nie chce używać loginów do Facebooka lub Gmaila.
Bartho Bernsmann

Nie sądzę, aby konieczne było odrzucanie tej odpowiedzi. Wystarczy głos za pierwszym komentarzem. Ta odpowiedź zawiera użyteczne informacje, a osoba odpowiadająca włożyła prawdziwy twórczy wysiłek w ich dostarczenie. Why punish that effort? Być może SO potrzebuje sposobu na oznaczenie odpowiedzi jako niewłaściwie dopasowanej do pytania PO. Lub pozwolić użytkownikom na sugerowanie przeniesienia go do bardziej odpowiedniego pytania ... lub utworzenie nowego pytania na podstawie odpowiedzi.
Walter Stabosz
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.