2019. 11. 8. 15:30

OAuth2 관련 내용은 잘 정리되 있는 내용이 많으니 전 링크로 대신하겠습니다.

참고 : Naver Hello world - OAuth와 춤을  

 

OAuth2의 ASP.NET자료가 많지 않아서 제가 정리해봅니다.

사실은...... 코드 프로젝트의 글을 .Net Core 2.2로 포팅만 한 겁니다.

(참고 : code project - Livio Francescucci님의 글 Simple OAuth2 Authorization Server with Identity Server and .NET Core )

 

연관글 영역

 

 

연관글 영역

 

 

 

1. 프로젝트 세팅

프로젝트는 생성 옵션은

 

닷넷 코어 2.2

웹 응용프로그램

빈 프로젝트

입니다.

 

 

1-1. html 세팅

빈 프로젝트는 아무것도 없기 때문에 html을 읽을 수 있도록 세팅합니다.

 

참고 : [ASP.NET Core] 빈 프로젝트 세팅 (1) - 'index.html'을 시작페이지로 설정하기

 

html은 바디에 안내만 넣어줍니다.

이 서버의 html은 웹서버가 동작하고 있는지만 확인하게 됩니다.

 

 

 

 

토큰 발급 테스트

이 'index.html'에서 토큰 발급이 잘되는지 확인해 보려면 다음과 같이 작성하면 됩니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
 
    <script src="https://code.jquery.com/jquery-3.4.1.min.js"
            integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
            crossorigin="anonymous"></script>
 
 
    <script>
        var access_token = "";
 
        function CallToken()
        {
            $.ajax({
                type: "POST"
                , url: "http://localhost:1207/connect/token"
                , data: {
                    "grant_type""client_credentials"
                    , "client_id""ClientIdThatCanOnlyRead"
                    , "client_secret""secret1"
                    , "scope""scope.readaccess"
                }
                , dataType: "json"
                , success: function (result) {
                    console.log(result);
                    access_token = result.access_token;
                }
            });
 
        }
    </script>
</head>
<body>
    이 서버는 인증만 가능합니다.
</body>
</html>
cs

 

 

'CallToken()'를 호출하면 키가 발급되는지 확인이 가능합니다.

 

 

 

2. 'IdentityServer4' 설치

'IdentityServer4'는 ASP.NET Core를위한 무료 오픈 소스 OpenID Connect 및 OAuth 2.0 프레임 워크입니다.

 

누겟에서 'IdentityServer4'를 찾아 설치합니다.

우리는 Core 2.2 가 기준이라 2.x 버전을 설치해야 합니다.

 

 

 

 

 

3. 'Config.cs' 생성

인증 관련 내용이 들어가 있는 클래스입니다.

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class Config
{
    // scopes define the API resources in your system
    //API의 인증 범위를 정의한다.
    public static IEnumerable<ApiResource> GetApiResources()
    {
        return new List<ApiResource>
        {
            new ApiResource("scope.readaccess""Example API"),
            new ApiResource("scope.fullaccess""Example API"),
            new ApiResource("YouCanActuallyDefineTheScopesAsYouLike""Example API")
        };
    }
 
    // client wants to access resources (aka scopes)
    //클라이언트 접근 범위를 설정한다.
    public static IEnumerable<Client> GetClients()
    {
        return new List<Client>
        {
            new Client
            {
                ClientId = "ClientIdThatCanOnlyRead"
                , AllowedGrantTypes = GrantTypes.ClientCredentials
 
                , ClientSecrets = { new Secret("secret1".Sha256())}
                , AllowedScopes = { "scope.readaccess" }
            },
            new Client
            {
                ClientId = "ClientIdWithFullAccess"
                , AllowedGrantTypes = GrantTypes.ClientCredentials
 
                , ClientSecrets = { new Secret("secret2".Sha256()) }
                , AllowedScopes = { "scope.fullaccess" }
            }
        };
    }
}
cs

 

 

5번 라인의 코드는 인증범위를 구분하기 위한 이름을 정의하는 것입니다.

 

24번 라인의 코드는 인증 서버가 클라이언트와 상호 작용하는 방식을 지정하는 것입니다.

(참고 : IdentityServer4 Document - Grant Types )

 

'GrantTypes.ClientCredentials'는 클라이언트에 부여된 정보로 인증하는 방식입니다.

그렇기 때문에 리플레시 토큰이 발급되지 않고

액세스 토큰이 만료되면 다시 발급받는 방식으로 구현됩니다.

 

클라이언트가 'clientId'를 보내게 되는데 이 정보를 기준으로 허용가능한 범위 포함하여 토큰이 생성하여 전달합니다.

 

 

 

4. 'IdentityServer' 미들웨어 기능 활성화
이제 위에서 만든 컨피그를 로드하여 'IdentityServer'가 OAuth2처리가 되도록 설정합니다.

 

'ConfigureServices' 함수에 코드를 추가합니다.

 

1
2
3
4
5
6
7
8
9
10
11
public void ConfigureServices(IServiceCollection services)
{
    //AddInMemoryApiResources   : OAuth2 미들웨어 설정
    //AddInMemoryClients        : OAuth2 미들웨어 설정
    services.AddIdentityServer()
            .AddDeveloperSigningCredential()
            .AddInMemoryApiResources(Config.GetApiResources())
            .AddInMemoryClients(Config.GetClients());
 
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
cs

 

 

 

다음 코드를 'Configure'의 맨 앞에 아래 코드를 추가합니다.

 

1
2
3
4
5
6
7
//OAuth2 미들웨어(IdentityServer) 접근 권한
app.UseCors(options =>
{
    options.AllowAnyOrigin();
});
//OAuth2 미들웨어(IdentityServer) 설정
app.UseIdentityServer();
cs

 

 

'app.UseCors'는 외부 접근 권한을 설정하는 함수입니다.

'app.UseIdentityServer();'는 미들웨어를 서버가 시작될때 시작시키도록 하는 코드 입니다.

 

 

 

'JWT 토큰을 만들 수 없습니다.' 오류

만약 여기서

'.AddDeveloperSigningCredential()'

를 빼먹으면 다음과 같은 에러가 납니다.

 

System.InvalidOperationException: No signing credential is configured. Can't create JWT token

 

예전 코드를 쓰는 경우 쉽게 만날 수 있죠 ㅎㅎㅎ

(참고 : github IdentityServer/IdentityServer4 - Error after moving to EntityFramework Core for configuration data #375 )

 

 

 

5. 테스트

원래 인증 서버는 테스트용 클라이언트를 구성해야 하는 게 맞지만......

 

미들웨어에서 주는 정보가 있으니 요청해 봅시다.

 

http://localhost:[설정된 포트]/.well-known/openid-configuration

 

 

 

 

 

마무리

완성된 샘플 : Github - dang-gun/OAuth2Sample/AuthorizationServer/

 

 

이거 샘플을 겨우 찾았습니다.....

보통 'OAuth2'를 구현하는 내용보다는 클라이언트로서 붙여 쓰는 내용을 다루기 때문이죠 ㅎㅎㅎㅎㅎ

저도 거기까지 다룰 예정입니다.

물론 이 미들웨어도 더 깊이 다뤄볼 예정입니다.