ASP.NET MVC 5 및 WEB API 2에서 oauth2 서버를 구현하는 방법 [닫기]


127

먼저 프로젝트를 스케치하겠습니다.

인턴쉽을 위해서는 기존 시스템에 기능을 추가해야합니다. OAuth2를 통해 사용자가 권한을 부여한 타사 클라이언트는 AX 웹 서비스의 데이터에 액세스 할 수 있어야합니다. 나는 클라이언트가 전화를 걸고 AX 서비스를 호출 할 수있는 '프록시 웹 서비스'를 만들어야한다는 것을 이해하지만 OAuth2 부분에 대해서는 약간 확실하지 않습니다. 대부분의 자습서 및 안내서는 Facebook 또는 Google 로그인에 ASP.NET의 ID를 사용하는 것에 관한 것입니다. 필요하지 않습니다. 기존 자격 증명을 사용해야하므로 고유 한 OAuth2 서비스를 만들어야합니다.

이에 대한 자습서, 안내서 또는 설명을 찾기가 어렵습니다. OAuth2와 수행해야 할 작업을 이해하지만 이전에는 그런 일을 한 적이 없으며 시작하기가 어렵습니다. 내가 찾은 것에 가장 가까운 것은이 github repo link 이지만 솔루션은 빌드되지 않습니다.

내가 염두에 둔 것은 클라이언트 (타사)가 자신을 등록하고 고객 ID를 얻을 수있는 ASP.NET MVC 웹 사이트를 만드는 것입니다. ASP.NET API를 사용하여 필요한 토큰과 매개 변수를 취하는 API를 만들고 Dyn AX 서비스에 액세스하려고했습니다.

이것이 맞습니까? 아니면 완전히 틀렸습니까? 자신 만의 oauth2 서버 / 서비스 구축에 관한 도움이나 링크가 있으면 좋을 것입니다.


답변:


189

나는 살펴볼 것이지만 챕터 이름에서 나는 그것이 신원 및 페이스 북 / 구글 로그인 신원 제공자에 초점을 맞추기 때문에 내가 검색하는 것이 아니라고 생각합니다.
Robin

3
4 부만 페이스 북과 구글에 관한 것입니다. 두 달 전에이 자습서를 기반으로 자체 인증 컨트롤러를 구현했습니다. 그리고 내 자신의 사용자 데이터베이스도 사용하고있었습니다.
MichaelS

1
질문이 하나 더 있습니다.이 토큰은 어디에 저장됩니까? 아이덴티티가 이것을 전적으로 처리합니까?
Robin

17
내 블로그 게시물을 참조에 대한 감사를 @MichaelS, 다행이 :) 프로젝트에 도움이되었다
Taiseer 조우 데흐 가문

@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
  • OWIN startup클래스 추가

그런 다음 index.js다음 내용 으로 HTML과 JavaScript ( ) 파일을 작성하십시오 .

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 및 토큰 발행에 중점을 둡니다. 아주 좋아요 블로그에 게시 해 주셔서 감사합니다.
webworm

@Kai-어디서 Microsoft ASP.NET Identity Owin게임을 시작합니까? 사용자 인증에 ASP.NET ID를 사용하고 있습니까? 그렇지 않은 경우이 NuGet 패키지가 여전히 필요합니까?
webworm

1
@webworm-라인이 app.UseOAuthBearerTokens(OAuthOptions);없으면 작동하지 않습니다 Microsoft ASP.NET Identity Owin. 방법을 인식하지 못합니다 UseOAuthBearerTokens.
Kai Hartmann

패키지 누락 : Microsoft.Owin.Host.SystemWeb, 마이크로 소프트 ASP.NET 신원 Owin
모하메드 아프 설

3
그냥 한 가지를 추가하고 싶습니다. 즉, Newtonsoft.Json 잘못된 어셈블리 오류 (.NET 4.6 이상)가 발생하면 Newtonsoft.Json을 버전 11 이상으로 업데이트하십시오.
vibs2006


-12

Gmail : OAuth

  • 고토 링크
  • Gmail 사용자 이름 비밀번호로 로그인
  • 왼쪽 상단의 Google 메뉴를 클릭하십시오
  • API 관리자를 클릭하십시오.
  • 자격 증명을 클릭하십시오
  • 신임 정보 작성을 클릭하고 OAuth 클라이언트를 선택하십시오.
  • 웹 애플리케이션을 애플리케이션 유형으로 선택하고 이름-> 권한있는 리디렉션 URL 입력 (예 : http : // localhost : 53922 / signin-google )-> 생성 버튼을 클릭하십시오. 자격 증명이 생성됩니다. PLS의 메모를 확인 Client ID하고 Secret ID. 마지막으로 확인을 클릭하여 자격 증명 팝업을 닫습니다.
  • 다음으로 중요한 단계는를 활성화하는 것 Google API입니다. 왼쪽 창에서 개요를 클릭하십시오.
  • Google API아래의 소셜 API 섹션을 클릭하십시오 .
  • 사용을 클릭하십시오.

그게 전부 구글 부분입니다.

애플리케이션으로 돌아와서 App_start/Startup.Auth.cs다음 스 니펫을 열고 주석을 해제하십시오.

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

업데이트 ClientIdClientSecret의 값으로 Google API이미 만든 자격 증명.

  • 응용 프로그램을 실행
  • 로그인을 클릭하십시오
  • '다른 섹션을 사용하여 로그인'섹션에 Google 버튼이 있습니다.
  • 구글 버튼을 클릭
  • 응용 프로그램은 사용자 이름과 암호를 입력하라는 메시지를 표시합니다
  • Gmail 사용자 이름과 비밀번호를 입력하고 로그인을 클릭하십시오.
  • 그러면 OAuth가 수행되고 응용 프로그램으로 돌아와 GmailID 를 등록하라는 메시지가 표시됩니다 .
  • 등록을 클릭하여 GmailID를 애플리케이션 데이터베이스 에 등록하십시오 .
  • 아이디 세부 정보가 맨 위에 일반 등록으로 표시됩니다
  • Gmail을 통해 로그 아웃 한 후 다시 로그인하십시오. 그러면 자동으로 앱에 로그인됩니다.

15
사용자가 Facebook 또는 Gmail 로그인을 사용하고 싶지 않다고 명시 적으로 명시하고 있습니다.
Bartho Bernsmann

이 답변을 공감해야 할 필요는 없다고 생각합니다. 최고 의견에 대한 찬성으로 충분합니다. 이 답변에는 유용한 정보가 포함되어 있으며 답변자는 해당 정보를 제공하기위한 실질적인 창의적 노력을 기울였습니다. Why punish that effort? 아마도 SO는 OP 질문에 잘못 할당 된 것으로 답변을 표시하는 방법이 필요할 것입니다. 또는 사용자가 더 적절한 질문으로 이동하도록 제안하거나 답변에서 새 질문을 만들 수 있습니다.
Walter Stabosz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.