Bagaimana menerapkan server oauth2 di ASP.NET MVC 5 dan WEB API 2 [ditutup]


127

Pertama saya akan membuat sketsa proyek saya:

Untuk magang saya, saya perlu menambahkan fungsionalitas ke sistem yang ada. Klien pihak ke-3 harus dapat mengakses data dari layanan Web AX begitu dia diizinkan oleh pengguna melalui OAuth2. Saya mengerti bahwa saya perlu membuat 'layanan web proxy' di mana klien dapat melakukan panggilan dan yang memanggil layanan AX tetapi saya agak tidak yakin tentang bagian OAuth2. Sebagian besar tutorial dan panduan tentang cara menggunakan ASP.NET's Identity untuk Facebook atau Google-login. Saya tidak membutuhkan itu, saya perlu menggunakan kredensial yang sudah ada sehingga saya perlu membuat layanan OAuth2 saya sendiri.

Saya kesulitan menemukan tutorial, panduan, atau penjelasan tentang ini. Saya mengerti OAuth2 dan apa yang perlu dilakukan, tetapi saya belum pernah melakukan hal seperti itu sebelumnya dan sulit untuk memulai. Hal yang paling dekat dengan yang saya butuhkan adalah tautan repo github ini , tetapi solusinya tidak dibangun.

Apa yang saya pikirkan adalah membuat Situs Web ASP.NET MVC di mana klien (pihak ketiga) dapat mendaftarkan diri dan memperoleh ID Klien mereka. Dengan ASP.NET API saya ingin membuat API yang mengambil token dan parameter yang diperlukan, dan kemudian mengakses layanan Dyn AX.

Apakah ini benar atau saya sepenuhnya salah? Bantuan atau tautan apa pun yang terkait dengan membangun server / layanan oauth2 Anda sendiri akan menyenangkan.


Jawaban:


189

Saya akan melihat tetapi dari nama bab saya pikir itu lagi bukan apa yang saya cari karena berfokus pada Identity dan penyedia identitas login facebook / google.
Robin

3
Hanya bagian 4 yang membahas tentang facebook dan google. Saya menerapkan kontroler otentikasi saya sendiri berdasarkan tutorial ini dua bulan lalu. Dan saya juga menggunakan basis data pengguna saya sendiri.
MichaelS

1
Saya punya satu pertanyaan lagi, di mana token ini dapat disimpan? Apakah Identitas menangani ini sepenuhnya?
Robin

17
@MichaelS terima kasih telah merujuk pada posting blog saya, senang itu membantu proyek Anda :)
Taiseer Joudeh

@MichaelS Saya ragu apakah cara otentikasi berbasis Token cukup aman untuk api sisanya. karena jika saya bisa mendapatkan token pengguna di browser-nya. Saya pikir itu bisa dicapai karena token disimpan di header permintaan Authentication. Saya dapat melakukan semua yang saya inginkan seperti mendapatkan / memposting / menaruh / menghapus.
Joe.wang

87

Saya juga kesulitan menemukan artikel tentang cara membuat bagian token. Saya tidak pernah menemukan dan menulis sendiri. Jadi, jika itu membantu:

Yang harus dilakukan adalah:

  • Buat aplikasi web baru
  • Instal paket NuGet berikut:
    • Microsoft.Owin
    • Microsoft.Owin.Host.SystemWeb
    • Microsoft.Owin.Security.OAuth
    • Microsoft.AspNet.Identity.Owin
  • Tambahkan startupkelas OWIN

Kemudian buat file HTML dan JavaScript ( index.js) dengan konten ini:

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>

Kelas OWIN startupharus memiliki konten ini:

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

Jalankan proyek Anda. Token harus ditampilkan di jendela sembul.


5
Saya sangat suka bagaimana Anda tidak memasukkan ASP Identity atau Entity Framework. Sebagian besar artikel yang saya lihat mengintegrasikan ini dengan solusi OAuth. Solusi Anda berfokus pada OAuth dan penerbitan token. Sangat bagus. Terima kasih juga telah memposting di blog Anda.
cacing web

@ Kai - Di mana Microsoft ASP.NET Identity Owinbermain? Apakah Anda menggunakan ASP.NET Identity untuk otentikasi pengguna Anda? Jika tidak, apakah paket NuGet ini masih diperlukan?
webworm

1
@webworm - Baris app.UseOAuthBearerTokens(OAuthOptions);tidak akan bekerja tanpa Microsoft ASP.NET Identity Owin. Itu tidak mengenali metode UseOAuthBearerTokens.
Kai Hartmann

paket yang hilang: Microsoft.Owin.Host.SystemWeb, Microsoft ASP.NET Identity Owin
Muhammed Afsal

3
Saya hanya ingin menambahkan satu hal yaitu jika Anda juga mendapatkan kesalahan perakitan yang tidak valid Newtonsoft.Json (dalam. NET 4.6 dan di atas) maka silakan perbarui Newtonsoft.Json ke versi 11 atau di atas.
vibs2006


-12

Gmail: OAuth

  • Mendapat tautan
  • Login dengan kata sandi nama pengguna gmail Anda
  • Klik pada menu google di kiri atas
  • Klik Manajer API
  • Klik pada Kredensial
  • Klik Buat Kredensial dan pilih Klien OAuth
  • Pilih Aplikasi Web sebagai jenis Aplikasi dan Masukkan Nama-> Masukkan URL Pengalihan Resmi (Contoh: http: // localhost: 53922 / signin-google ) -> Klik tombol Buat. Ini akan membuat kredensial. Tolong catat Client IDdan Secret ID. Terakhir, klik OK untuk menutup kredensial yang muncul.
  • Langkah penting berikutnya adalah mengaktifkan Google API. Klik Ikhtisar di panel kiri.
  • Klik pada bagian Google APIbawah API Sosial.
  • Klik Aktifkan.

Itu semua dari bagian Google.

Kembali ke aplikasi Anda, buka App_start/Startup.Auth.csdan batalkan komentar pada cuplikan berikut

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

Perbarui ClientIddan ClientSecretdengan nilai dari Google APIkredensial yang telah Anda buat.

  • Jalankan aplikasi Anda
  • Klik Login
  • Anda akan melihat tombol Google di bawah bagian 'Gunakan Bagian Lain untuk masuk'
  • Klik pada tombol Google
  • Aplikasi akan meminta Anda untuk memasukkan nama pengguna dan kata sandi
  • Masukkan nama pengguna dan kata sandi gmail dan klik Masuk
  • Ini akan melakukan OAuth dan kembali ke aplikasi Anda dan meminta Anda untuk mendaftar dengan Gmailid.
  • Klik daftar untuk mendaftarkan Gmailid ke dalam basis data aplikasi Anda.
  • Anda akan melihat rincian Identitas muncul di bagian atas sebagai pendaftaran normal
  • Coba keluar dan masuk lagi melalui Gmail. Ini akan secara otomatis mencatat Anda ke dalam aplikasi.

15
Pengguna secara eksplisit menyatakan bahwa ia tidak ingin menggunakan login Facebook atau Gmail.
Bartho Bernsmann

Saya tidak berpikir perlu untuk menurunkan jawaban ini. Suara positif pada komentar teratas sudah cukup. Jawaban ini berisi informasi yang berguna, dan jawaban yang dikeluarkan upaya kreatif nyata untuk memberikan informasi tersebut. Why punish that effort? Mungkin SO membutuhkan cara untuk menandai jawaban yang tidak sesuai dengan pertanyaan OP. Atau untuk memungkinkan pengguna menyarankannya dipindahkan ke pertanyaan yang lebih tepat ... atau untuk membuat pertanyaan baru dari jawabannya.
Walter Stabosz
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.