2017-05-21 1 views
1

약간의 아키텍처 문제가 있습니다. Identity Server 솔루션을 통해 Identity 사용자 저장소 (데이터베이스의 사용자 포함)를 통해 사용자를 인증합니다. 여기에 로그인 기능이있어서 기능을 등록합니다. 그래서 여기에서 DbContext를 사용해야합니다. ID 테이블이 아닌 사용자 지정 테이블을 보유하고있는 다른 솔루션 API가 있습니다. 모든 테이블은 동일한 데이터베이스에 있습니다.클레임 데이터를 사용하여 CreatedBy 사용자 데이터를 사용자 정의 테이블에 삽입 할 수 있습니까?

이제 API를 통해 새 레코드를 추가하면 어떻게 든 CreadetBy를 ID 사용자와 연결하려고합니다. 클레임에서 사용자에 대한 정보를 얻은 다음 새 행을 만드는 동안 삽입 할 수 있지만 그 좋은 방법입니까?

또 다른 질문은 IdentityServer 프로젝트에서 등록 작업을 이동하고 거기에 ID 사용자 저장소로만 로그인 기능을 사용하고 API에 등록을해야하므로 두 곳에서 ApplicationUser에 대한 추가 필드를 복제하지 않습니까?

+0

그래서 두 개의 컨텍스트, 정체성에 대해 하나의 사용자 정의 테이블에 대한 하나가 :

나는이 기사를 추천 하시겠습니까? 데이터베이스의 사용자 테이블을 사용하면 AspNetUsers 테이블을 의미합니까? 또한 사용자 정의 컨텍스트에 users 테이블이 있습니까? –

+0

예 사용자 정의 컨텍스트에서 사용자 테이블이 있지만 사용자 지정 테이블과 연결해야하기 때문에 추가했습니다.나는 어떻게 든 중복없이 한 곳에 보관하고 싶다. 너 내가 무슨 뜻인지 알지. AspNetUsers 테이블과 연결되어있는 사용자 정의 테이블 자동차를 만들면 링크를 만들어야할지, 아니면 일반 필드 CreatedBy를 만들고 User.Identity.Name을 사용하여 해당 사용자 정의 테이블을 채울 수 있습니까? 어느 사용자가 AspNetUsers로 자동차를 만들었는지 추측하고 싶습니다. 자동차 테이블 USERID를 얻고 aspnetUsers를 USERID로 쿼리하면됩니다. 내가 뭐라는지 알 겠어? –

답변

3

나는 당신이 걱정의 분리를 유지해야한다는 것을 이해합니다. 동일한 컨텍스트를 공유하지 않는 테이블간에 관계를 가져서는 안됩니다. 이것은 자동차가 결코 AspNetUsers에 링크 할 수 없다는 것을 의미합니다.

그것은 개체와 필드의 의미에 관한 것입니다. 예를 들어, IdentityUser와 CustomUser는 동일하지만 보이지 않습니다. IdentityUser에는 CustomUser가 사용자 지정 모델에 필요한 모든 정보가있는 사용자를 식별하는 데 필요한 모든 정보가 있습니다. 사실, 로그인 계정이없는 CustomUsers를 가질 수 있습니다.

이메일 주소도 고려하십시오. 두 입력란 모두에서이 입력란을 사용하는 것은 불필요한 것으로 보이지만 맞춤 이메일 주소에 대한 업데이트를 받고 싶을 때 실제로 내 Google 계정을 사용하여 로그인 할 수 있습니다.

그래서 CreatedBy 필드의 의미는 무엇이며 어떻게 사용할 예정입니까? 보고서와 같이 맞춤 문맥의 일부인 경우 CustomUser 테이블이 있어야하며 해당 테이블과 관련이 있어야합니다. 사용자 이름을 저장하는 것보다 관리 목적으로이 항목을 확인하기 만하면됩니다. 당신은 그 분야별로 질문 할 것입니까? CustomUserAddress와 같은 추가 정보가 필요합니까?

잘 수행되면 중복 필드가 실제로 있다고 생각하지 않습니다. 그들 모두는 다른 목적/의미를 가지고 있기 때문에.

어쨌든 당신은 문맥을 넘어서고 싶지 않습니다. 그리고 다른 컨텍스트에서 정보를 검색하기 위해 id 목록을 보내는 것을 원하지 않습니다.

문제는 현재 사용자를 연결하려는 것입니다. ID 토큰은 사용자를 식별하는 데 사용됩니다. 이는 귀하의 리소스에 아무런 의미가 없습니다. 그러나 액세스 토큰에는 자원의 실제 사용자에 대한 정보가 들어 있습니다.

권한 부여를 리소스에 가깝게 유지하면 CustomUserId를 사용하여 권한 부여 사용자를 확장 할 수 있습니다. 이 정보는 권한 부여의 일부이므로 액세스 토큰에 추가하십시오. 사용자가 지정된 사용자의 데이터에만 액세스 할 수 있음을 리소스에 알립니다.

[access token] .customUserId를 사용하면 CustomUser와 일치시킬 수 있습니다. 따라서 CreatedBy는 CustomUser.Id 값을 가져야합니다. https://leastprivilege.com/2016/12/16/identity-vs-permissions/

+0

좋은 설명! 하지만 Access Token에 CustomUserId를 어떻게 추가합니까? Identity Server 프로젝트는 API 프로젝트에서 CustomUser 모델에 액세스 할 수 없습니다. 그리고 언제 내 CustomUser를 만들 수 있습니까? IdentityServer는 등록시 IdentityUser를 만들고 내 API 프로젝트는 관련 사용자 정의 사용자를 생성 할시기를 어떻게 알 수 있습니까? 이 작업을 수행하는 방법에 대한 자습서 또는 예제가 있습니까? – Skullbox

+1

@Skullbox 두 가지 옵션이 있다고 생각합니다. 1) 추가 정보가 필요하지 않은 경우 CustomerUser에 '하위'열을 추가하고 소유권 주장에 'sub'를 사용하여 사용자를 식별 할 수 있습니다. CustomerUser 레코드가 없으면 (하위 열은 하위 소유권 주장과 일치 할 수 없음) 새 CustomerUser를 만듭니다. 2) 등록시 식별자를 AspNetUserClaims에 추가해야합니다. GUID를 ID로 생성하거나 API를 호출하여 CustomerUser를 등록하고 획득 한 CustomerUser.Id를 사용합니다. –

관련 문제