วิธีติดตั้งเซิร์ฟเวอร์ oauth2 ใน ASP.NET MVC 5 และ WEB API 2 [ปิด]


127

ก่อนอื่นฉันจะร่างโครงการของฉัน:

สำหรับการฝึกงานของฉันฉันต้องเพิ่มฟังก์ชันการทำงานให้กับระบบที่มีอยู่ ไคลเอ็นต์ของบุคคลที่สามต้องสามารถเข้าถึงข้อมูลจาก AX Webservices เมื่อได้รับอนุญาตจากผู้ใช้ผ่าน OAuth2 ฉันเข้าใจว่าฉันจำเป็นต้องสร้าง 'บริการเว็บพร็อกซี' โดยที่ไคลเอนต์สามารถโทรออกและเรียกใช้บริการ AX ได้ แต่ฉันไม่แน่ใจเกี่ยวกับส่วน OAuth2 เล็กน้อย บทแนะนำและคำแนะนำส่วนใหญ่เกี่ยวกับการใช้ข้อมูลประจำตัวของ ASP.NET สำหรับ Facebook หรือ Google-logins ฉันไม่ต้องการสิ่งนั้นฉันต้องใช้ข้อมูลรับรองที่มีอยู่ดังนั้นฉันจึงต้องสร้างบริการ OAuth2 ของฉันเอง

ฉันพบว่ามันยากที่จะหาบทเรียนคำแนะนำหรือคำอธิบายเกี่ยวกับเรื่องนี้ ฉันเข้าใจ OAuth2 และสิ่งที่ต้องทำ แต่ฉันไม่เคยทำสิ่งนี้มาก่อนและพบว่ามันยากที่จะเริ่มต้น สิ่งที่ใกล้เคียงที่สุดกับสิ่งที่ฉันต้องการที่ฉันพบคือลิงก์ github repoนี้ แต่โซลูชันไม่ได้สร้างขึ้น

สิ่งที่ฉันคิดคือการสร้างเว็บไซต์ ASP.NET MVC ที่ลูกค้า (บุคคลที่สาม) สามารถลงทะเบียนด้วยตนเองและรับรหัสลูกค้าของตนได้ ด้วย ASP.NET API ฉันต้องการสร้าง API ที่รับโทเค็นและพารามิเตอร์ที่ต้องการจากนั้นเข้าถึงบริการ Dyn AX

นี่ถูกต้องหรือฉันผิดทั้งหมด? ความช่วยเหลือหรือลิงค์เกี่ยวกับการสร้างเซิร์ฟเวอร์ / บริการ oauth2 ของคุณเองก็น่าจะดี


คำตอบ:


189

ฉันจะดู แต่จากชื่อบทฉันคิดว่ามันไม่ใช่สิ่งที่ฉันค้นหาอีกครั้งเนื่องจากเน้นไปที่ Identity และผู้ให้บริการข้อมูลประจำตัวเข้าสู่ระบบ facebook / google
Robin

3
เฉพาะตอนที่ 4 คือเกี่ยวกับ facebook และ google ฉันใช้ตัวควบคุมการตรวจสอบสิทธิ์ของตัวเองตามบทช่วยสอนเหล่านี้เมื่อสองเดือนก่อน และฉันก็ใช้ฐานข้อมูลผู้ใช้ของฉันเองด้วย
MichaelS

1
ฉันมีคำถามอีกอย่างหนึ่งว่าโทเค็นเหล่านี้จะถูกเก็บไว้ที่ไหน? Identity ดูแลเรื่องนี้ทั้งหมดหรือไม่?
Robin

17
@MichaelS ขอบคุณที่อ้างถึงบล็อกโพสต์ของฉันดีใจที่มีประโยชน์สำหรับโครงการของคุณ :)
Taiseer Joudeh

@ MichaelS ฉันสงสัยว่าวิธีการรับรองความถูกต้องโดยใช้โทเค็นมีความปลอดภัยเพียงพอสำหรับ API ที่เหลือหรือไม่ เพราะถ้าฉันสามารถรับโทเค็นของผู้ใช้ได้ในเบราว์เซอร์ของเขา Authenticationฉันคิดว่ามันสามารถทำได้เพราะโทเค็นจะถูกเก็บไว้ในส่วนหัวของการร้องขอ ฉันสามารถทำทุกอย่างที่ต้องการเช่น get / post / put / delete
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>

startupคลาสOWIN ควรมีเนื้อหานี้:

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

@ ไก่ - Microsoft ASP.NET Identity Owinเข้ามาเล่นที่ไหน? คุณใช้ ASP.NET Identity สำหรับการตรวจสอบผู้ใช้ของคุณหรือไม่? ถ้าไม่เช่นนั้นแพ็คเกจ NuGet นี้ยังจำเป็นอยู่หรือไม่?
webworm

1
@webworm - สายทำงานตามปกติโดยไม่ต้องapp.UseOAuthBearerTokens(OAuthOptions); มันไม่รู้จักวิธีการMicrosoft ASP.NET Identity Owin UseOAuthBearerTokens
Kai Hartmann

แพคเกจที่ขาดหายไป: Microsoft.Owin.Host.SystemWeb, Microsoft ASP.NET Identity Owin
Muhammed Afsal

3
ฉันแค่ต้องการเพิ่มสิ่งหนึ่งเช่นหากคุณได้รับข้อผิดพลาดการประกอบ Newtonsoft.Json ที่ไม่ถูกต้อง (ใน. NET 4.6 ขึ้นไป) จากนั้นโปรดอัปเดต Newtonsoft.Json เป็นเวอร์ชัน 11 ขึ้นไป
vibs2006

4

ฉันกำลังค้นคว้าสิ่งเดียวกันและสะดุดกับidentityserverซึ่งใช้ OAuth และ OpenID ที่ด้านบนของ ASP.NET รวมเข้ากับASP.NET identityและMembership Rebootพร้อมการสนับสนุนการคงอยู่สำหรับ Entity Framework

ดังนั้นเพื่อตอบคำถามของคุณตรวจสอบเอกสารรายละเอียดของพวกเขาในวิธีการติดตั้งเซิร์ฟเวอร์ OAuth และ OpenID


-12

Gmail: OAuth

  • ไปที่ลิงค์
  • เข้าสู่ระบบด้วยรหัสผ่านชื่อผู้ใช้ gmail ของคุณ
  • คลิกเมนู google ที่ด้านบนซ้าย
  • คลิกตัวจัดการ API
  • คลิกที่ข้อมูลรับรอง
  • คลิกสร้างข้อมูลรับรองและเลือกไคลเอ็นต์ OAuth
  • เลือกเว็บแอปพลิเคชันเป็นประเภทแอปพลิเคชันและป้อนชื่อ -> ป้อน URL การเปลี่ยนเส้นทางที่ได้รับอนุญาต (เช่น: http: // localhost: 53922 / signin-google ) -> คลิกที่ปุ่ม Create สิ่งนี้จะสร้างข้อมูลรับรอง กรุณาจดบันทึกClient IDและSecret IDและสุดท้ายคลิกตกลงเพื่อปิดป๊อปอัปข้อมูลรับรอง
  • ขั้นตอนที่สำคัญต่อไปคือการเปิดใช้งานไฟล์ Google API . คลิกที่ภาพรวมในบานหน้าต่างด้านซ้าย
  • คลิกที่ Google APIภายใต้ส่วน Social APIs
  • คลิกเปิดใช้งาน

ทั้งหมดนี้มาจากส่วนของ Google

กลับมาที่แอปพลิเคชันของคุณเปิดApp_start/Startup.Auth.csและยกเลิกการแสดงความคิดเห็นข้อมูลโค้ดต่อไปนี้

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

อัปเดตClientIdและClientSecretด้วยค่าจากGoogle APIข้อมูลรับรองที่คุณสร้างไว้แล้ว

  • เรียกใช้แอปพลิเคชันของคุณ
  • คลิกเข้าสู่ระบบ
  • คุณจะเห็นปุ่ม Google ในส่วน "ใช้ส่วนอื่นเพื่อเข้าสู่ระบบ"
  • คลิกที่ปุ่ม Google
  • แอปพลิเคชันจะแจ้งให้คุณป้อนชื่อผู้ใช้และรหัสผ่าน
  • ป้อนชื่อผู้ใช้และรหัสผ่านของ gmail แล้วคลิกลงชื่อเข้าใช้
  • การดำเนินการนี้จะดำเนินการ OAuth และกลับมาที่แอปพลิเคชันของคุณและแจ้งให้คุณลงทะเบียนกับไฟล์ Gmailรหัส
  • คลิกลงทะเบียนเพื่อลงทะเบียนไฟล์ Gmail id ในฐานข้อมูลแอปพลิเคชันของคุณ
  • คุณจะเห็นรายละเอียดข้อมูลประจำตัวปรากฏที่ด้านบนเหมือนการลงทะเบียนปกติ
  • ลองออกจากระบบและเข้าสู่ระบบอีกครั้งผ่าน Gmail ระบบจะล็อกคุณเข้าสู่แอปโดยอัตโนมัติ

15
ผู้ใช้ระบุอย่างชัดเจนว่าไม่ต้องการใช้การเข้าสู่ระบบ Facebook หรือ Gmail
Bartho Bernsmann

ฉันไม่คิดว่าจำเป็นต้องลดคะแนนคำตอบนี้ การเพิ่มคะแนนให้กับความคิดเห็นด้านบนก็เพียงพอแล้ว คำตอบนี้ประกอบด้วยข้อมูลที่เป็นประโยชน์และคำตอบนั้นใช้ความพยายามอย่างสร้างสรรค์อย่างแท้จริงเพื่อให้ข้อมูลดังกล่าว Why punish that effort? บางที SO อาจต้องการวิธีตั้งค่าสถานะคำตอบเป็นคำถาม OPs ไม่ถูกต้อง หรือเพื่อให้ผู้ใช้สามารถแนะนำให้ย้ายไปยังคำถามที่เหมาะสมยิ่งขึ้น ... หรือสร้างคำถามใหม่จากคำตอบ
Walter Stabosz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.