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 )
프로젝트는 생성 옵션은
닷넷 코어 2.2
웹 응용프로그램
빈 프로젝트
입니다.
빈 프로젝트는 아무것도 없기 때문에 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()'를 호출하면 키가 발급되는지 확인이 가능합니다.
'IdentityServer4'는 ASP.NET Core를위한 무료 오픈 소스 OpenID Connect 및 OAuth 2.0 프레임 워크입니다.
누겟에서 'IdentityServer4'를 찾아 설치합니다.
우리는 Core 2.2 가 기준이라 2.x 버전을 설치해야 합니다.
인증 관련 내용이 들어가 있는 클래스입니다.
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'를 보내게 되는데 이 정보를 기준으로 허용가능한 범위 포함하여 토큰이 생성하여 전달합니다.
'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();'는 미들웨어를 서버가 시작될때 시작시키도록 하는 코드 입니다.
만약 여기서
'.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 )
원래 인증 서버는 테스트용 클라이언트를 구성해야 하는 게 맞지만......
미들웨어에서 주는 정보가 있으니 요청해 봅시다.
http://localhost:[설정된 포트]/.well-known/openid-configuration
완성된 샘플 : Github - dang-gun/OAuth2Sample/AuthorizationServer/
이거 샘플을 겨우 찾았습니다.....
보통 'OAuth2'를 구현하는 내용보다는 클라이언트로서 붙여 쓰는 내용을 다루기 때문이죠 ㅎㅎㅎㅎㅎ
저도 거기까지 다룰 예정입니다.
물론 이 미들웨어도 더 깊이 다뤄볼 예정입니다.