Cách triển khai máy chủ oauth2 trong ASP.NET MVC 5 và WEB API 2 [đã đóng]


127

Đầu tiên tôi sẽ phác thảo dự án của mình:

Đối với thực tập của tôi, tôi cần thêm chức năng cho một hệ thống hiện có. Khách hàng bên thứ 3 phải có thể truy cập dữ liệu từ AX Webservice sau khi được người dùng ủy quyền thông qua OAuth2. Tôi hiểu rằng tôi cần thực hiện một 'dịch vụ web proxy', theo đó khách hàng có thể thực hiện các cuộc gọi của mình và điều đó gọi các dịch vụ AX nhưng tôi không chắc lắm về phần OAuth2. Hầu hết các hướng dẫn và hướng dẫn là về việc sử dụng Nhận dạng ASP.NET cho đăng nhập Facebook hoặc Google. Tôi không cần điều đó, tôi cần sử dụng thông tin đăng nhập hiện có vì vậy tôi cần tạo dịch vụ OAuth2 của riêng mình.

Tôi thấy khó khăn để tìm hướng dẫn, hướng dẫn hoặc giải thích về điều này. Tôi hiểu OAuth2 và những gì cần phải làm, nhưng tôi chưa bao giờ làm điều đó trước đây và thấy khó để bắt đầu. Điều gần nhất với những gì tôi cần mà tôi tìm thấy là liên kết repo github này , nhưng giải pháp không được xây dựng.

Những gì tôi có trong tâm trí là tạo một trang web ASP.NET MVC nơi khách hàng (bên thứ 3) có thể tự đăng ký và có được ID khách hàng của họ. Với ASP.NET API, tôi muốn tạo API lấy các mã thông báo và tham số cần thiết, sau đó truy cập các dịch vụ Dyn AX.

Điều này đúng hay tôi hoàn toàn sai? Bất kỳ trợ giúp hoặc liên kết liên quan đến việc xây dựng máy chủ / dịch vụ oauth2 của riêng bạn sẽ tốt đẹp.


Câu trả lời:


189

Tôi sẽ xem xét nhưng từ tên chương tôi nghĩ nó không phải là thứ tôi tìm kiếm vì nó tập trung vào các nhà cung cấp nhận dạng đăng nhập facebook / google.
Robin

3
Chỉ có phần 4 là về facebook và google. Tôi đã triển khai bộ điều khiển xác thực của riêng mình dựa trên các hướng dẫn này hai tháng trước. Và tôi cũng đang sử dụng cơ sở dữ liệu người dùng của riêng mình.
MichaelS

1
Tôi có thêm một câu hỏi, những mã thông báo này được lưu trữ ở đâu? Nhận dạng có quan tâm đến điều này hoàn toàn?
Robin

17
@MichaelS cảm ơn vì đã tham khảo các bài đăng trên blog của tôi, rất vui vì nó hữu ích cho dự án của bạn :)
Taiseer Joudeh

@MichaelS Tôi nghi ngờ liệu cách xác thực dựa trên Token có đủ bảo mật cho api còn lại không. bởi vì nếu tôi có thể có mã thông báo của người dùng trong trình duyệt của anh ấy. Tôi nghĩ rằng nó có thể đạt được vì mã thông báo được lưu trữ trong tiêu đề yêu cầu Authentication. Tôi có thể làm mọi thứ tôi muốn như get / post / put / xóa.
Joe.wang

87

Tôi cũng vật lộn tìm kiếm các bài viết về cách chỉ tạo phần mã thông báo. Tôi không bao giờ tìm thấy một và viết của riêng tôi. Vì vậy, nếu nó giúp:

Những việc cần làm là:

  • Tạo một ứng dụng web mới
  • Cài đặt các gói NuGet sau:
    • Microsoft.Owin
    • Microsoft.Owin.Host.SystemWeb
    • Microsoft.Owin.Security.OAuth
    • Microsoft.AspNet.Identity.Owin
  • Thêm một startuplớp OWIN

Sau đó tạo tệp HTML và index.jstệp JavaScript ( ) với các nội dung sau:

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>

Lớp OWIN startupnên có nội dung này:

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

Chạy dự án của bạn. Mã thông báo sẽ được hiển thị trong cửa sổ bật lên.


5
Tôi thực sự thích cách bạn không mang Khung nhận dạng hoặc thực thể ASP. Hầu hết các bài viết tôi đã thấy tích hợp những điều này với giải pháp OAuth. Giải pháp của bạn tập trung vào OAuth và phát hành mã thông báo. Rất đẹp. Cảm ơn cũng đã đăng trên blog của bạn.
giun web

@Kai - Đi đâu Microsoft ASP.NET Identity Owinchơi? Bạn đang sử dụng ASP.NET Identity để xác thực người dùng của bạn? Nếu không, gói NuGet này có còn cần thiết không?
giun web

1
@webworm - Dòng app.UseOAuthBearerTokens(OAuthOptions);không hoạt động mà không có Microsoft ASP.NET Identity Owin. Nó không nhận ra phương thức UseOAuthBearerTokens.
Kai Hartmann

gói bị thiếu: Microsoft.Owin.Host.SystemWeb, Microsoft ASP.NET Nhận dạng Owin
Muhammed Afsal

3
Tôi chỉ muốn thêm một điều tức là nếu bạn cũng đang gặp Newtonsoft.Json lỗi lắp ráp không hợp lệ (trong .NET 4.6 trở lên) thì hãy cập nhật Newtonsoft.Json lên phiên bản 11 trở lên.
vibs2006 22/03/18


-12

Gmail: OAuth

  • Đi đến liên kết
  • Đăng nhập bằng mật khẩu tên người dùng gmail của bạn
  • Nhấp vào menu google ở ​​trên cùng bên trái
  • Nhấp vào Trình quản lý API
  • Nhấp vào Thông tin xác thực
  • Nhấp vào Tạo thông tin xác thực và chọn OAuth Client
  • Chọn Ứng dụng web làm Loại ứng dụng và Nhập Tên-> Nhập URL chuyển hướng được ủy quyền (Ví dụ: http: // localhost: 53922 / đăng nhập-google ) -> Nhấp vào nút Tạo. Điều này sẽ tạo ra các thông tin. Xin ghi chú Client IDSecret ID . Cuối cùng bấm OK để đóng thông tin đăng nhập bật lên.
  • Bước quan trọng tiếp theo là kích hoạt Google API . Nhấp vào Tổng quan trong khung bên trái.
  • Nhấp vào Google APIphần API xã hội.
  • Nhấp vào Kích hoạt.

Đó là tất cả từ phần Google.

Quay trở lại ứng dụng của bạn, mở App_start/Startup.Auth.csvà bỏ ghi chú đoạn mã sau

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

Cập nhật ClientIdClientSecretvới các giá trị từ Google APIthông tin đăng nhập mà bạn đã tạo.

  • Chạy ứng dụng của bạn
  • Nhấp vào Đăng nhập
  • Bạn sẽ thấy nút Google trong phần 'Sử dụng phần khác để đăng nhập'
  • Bấm vào nút Google
  • Ứng dụng sẽ nhắc bạn nhập tên người dùng và mật khẩu
  • Nhập tên người dùng và mật khẩu gmail và nhấp vào Đăng nhập
  • Điều này sẽ thực hiện OAuth và quay lại ứng dụng của bạn và nhắc bạn đăng ký với Gmailid.
  • Nhấn vào đăng ký để đăng ký Gmail id vào cơ sở dữ liệu ứng dụng của bạn.
  • Bạn sẽ thấy các chi tiết Danh tính xuất hiện trong đầu như đăng ký bình thường
  • Hãy thử đăng xuất và đăng nhập lại thông qua Gmail. Điều này sẽ tự động đăng nhập bạn vào ứng dụng.

15
Người dùng tuyên bố rõ ràng rằng anh ta không muốn sử dụng thông tin đăng nhập Facebook hoặc Gmail.
Bartho Bernsmann

Tôi không nghĩ cần phải đánh giá thấp câu trả lời này. Một upvote trên bình luận hàng đầu là đủ. Câu trả lời này chứa thông tin hữu ích và câu trả lời đã mở rộng nỗ lực sáng tạo thực sự để cung cấp thông tin đã nói. Why punish that effort? Có lẽ SO cần một cách để đánh dấu một câu trả lời là không đúng với câu hỏi của OP. Hoặc để cho phép người dùng đề xuất câu hỏi được chuyển sang câu hỏi phù hợp hơn ... hoặc để tạo câu hỏi mới từ câu trả lời.
Walter Stabosz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.