Dreamine.Identity 1.0.0.0
Dreamine.Identity 프로젝트의 API와 구성 요소를 제공합니다.
로딩중...
검색중...
일치하는것 없음
Dreamine.Identity.SqliteUserStore 클래스 참조sealed

더 자세히 ...

Dreamine.Identity.SqliteUserStore에 대한 상속 다이어그램 :
Dreamine.Identity.SqliteUserStore에 대한 협력 다이어그램:

클래스

class  TableColumn

Public 멤버 함수

 SqliteUserStore (IDatabaseProvider database)
async Task< AuthUserUpsertAsync (string provider, string providerKey, string email, string displayName, string avatarUrl, CancellationToken cancellationToken=default)
async Task< AuthUser?> GetByIdAsync (long id, CancellationToken cancellationToken=default)
async Task< AuthUser?> UpdateDisplayNameAsync (long id, string displayName, CancellationToken cancellationToken=default)
async Task< AuthUser?> AcceptRequiredConsentsAsync (long id, DateTime acceptedAtUtc, CancellationToken cancellationToken=default)
async Task< AuthUser?> ChangeLocalPasswordAsync (long id, string currentPassword, string newPassword, CancellationToken cancellationToken=default)
async Task< AuthUserCreateLocalAsync (string email, string displayName, string password, CancellationToken cancellationToken=default)
async Task< AuthUser?> ValidateLocalAsync (string email, string password, CancellationToken cancellationToken=default)

Private 멤버 함수

async Task< AuthUser?> FindLocalByEmailAsync (string email, CancellationToken cancellationToken)
void EnsureSchema ()
void AddNullableDateColumnIfMissing (HashSet< string > columns, string columnName)

정적 Private 멤버 함수

static string NormalizeEmail (string email)

Private 속성

readonly IDatabaseProvider _database

정적 Private 속성

const string SelectSql
const string LocalProvider = "Local"

상세한 설명

Dreamine 데이터베이스 추상화를 사용하는 SQLite 기반 IUserStore 구현입니다.

SqliteUserStore.cs 파일의 14 번째 라인에서 정의되었습니다.

생성자 & 소멸자 문서화

◆ SqliteUserStore()

Dreamine.Identity.SqliteUserStore.SqliteUserStore ( IDatabaseProvider database)
inline

데이터베이스 공급자로 저장소를 초기화하고 사용자 테이블과 필수 열을 보장합니다.

매개변수
database사용자 데이터를 저장할 데이터베이스 공급자입니다.
예외
ArgumentNullExceptiondatabasenull인 경우 발생합니다.

SqliteUserStore.cs 파일의 73 번째 라인에서 정의되었습니다.

74 {
75 _database = database ?? throw new ArgumentNullException(nameof(database));
76 _database.CreateTable<AuthUser>();
77 EnsureSchema();
78 }

다음을 참조함 : _database, EnsureSchema().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

멤버 함수 문서화

◆ AcceptRequiredConsentsAsync()

async Task< AuthUser?> Dreamine.Identity.SqliteUserStore.AcceptRequiredConsentsAsync ( long id,
DateTime acceptedAtUtc,
CancellationToken cancellationToken = default )
inline

사용자의 세 필수 동의 시각을 동일한 UTC 값으로 기록합니다.

매개변수
id내부 사용자 식별자입니다.
acceptedAtUtc동의를 수락한 UTC 시각입니다.
cancellationToken갱신 취소 토큰입니다.
반환값
갱신된 사용자 또는 없으면 null입니다.

Dreamine.Identity.IUserStore를 구현.

SqliteUserStore.cs 파일의 369 번째 라인에서 정의되었습니다.

373 {
374 var user = await GetByIdAsync(id, cancellationToken).ConfigureAwait(false);
375 if (user is null)
376 {
377 return null;
378 }
379
380 user.TermsAcceptedAtUtc = acceptedAtUtc;
381 user.PrivacyPolicyAcceptedAtUtc = acceptedAtUtc;
382 user.AgeConfirmedAtUtc = acceptedAtUtc;
383 await _database.UpdateAsync(user, cancellationToken).ConfigureAwait(false);
384 return user;
385 }

다음을 참조함 : _database, GetByIdAsync().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ AddNullableDateColumnIfMissing()

void Dreamine.Identity.SqliteUserStore.AddNullableDateColumnIfMissing ( HashSet< string > columns,
string columnName )
inlineprivate

열 집합에 없으면 nullable 날짜 텍스트 열을 Users 테이블에 추가합니다.

매개변수
columns현재 열 이름 집합입니다.
columnName확인하고 추가할 열 이름입니다.

SqliteUserStore.cs 파일의 780 번째 라인에서 정의되었습니다.

781 {
782 if (!columns.Contains(columnName))
783 {
784 _database.ExecuteNonQuery($"ALTER TABLE Users ADD COLUMN {columnName} TEXT NULL");
785 }
786 }

다음을 참조함 : _database.

다음에 의해서 참조됨 : EnsureSchema().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ ChangeLocalPasswordAsync()

async Task< AuthUser?> Dreamine.Identity.SqliteUserStore.ChangeLocalPasswordAsync ( long id,
string currentPassword,
string newPassword,
CancellationToken cancellationToken = default )
inline

로컬 사용자의 현재 비밀번호를 검증하고 강도가 확인된 새 해시를 저장합니다.

매개변수
id내부 사용자 식별자입니다.
currentPassword현재 평문 비밀번호입니다.
newPassword새 평문 비밀번호입니다.
cancellationToken변경 취소 토큰입니다.
반환값
갱신된 사용자 또는 없으면 null입니다.
예외
ArgumentNullExceptionnewPasswordnull인 경우 발생합니다.
ArgumentExceptionnewPassword 가 비어 있거나 공백인 경우 발생합니다.
InvalidOperationException소셜 계정이거나 현재 비밀번호가 틀렸거나 새 비밀번호가 8자 미만인 경우 발생합니다.

Dreamine.Identity.IUserStore를 구현.

SqliteUserStore.cs 파일의 459 번째 라인에서 정의되었습니다.

464 {
465 var user = await GetByIdAsync(id, cancellationToken).ConfigureAwait(false);
466 if (user is null)
467 {
468 return null;
469 }
470
471 if (!string.Equals(user.Provider, LocalProvider, StringComparison.OrdinalIgnoreCase))
472 {
473 throw new InvalidOperationException("소셜 로그인 계정의 비밀번호는 해당 로그인 제공자에서 관리됩니다.");
474 }
475
476 if (!DreaminePasswordHasher.VerifyPassword(currentPassword, user.PasswordHash))
477 {
478 throw new InvalidOperationException("현재 비밀번호가 올바르지 않습니다.");
479 }
480
481 ArgumentException.ThrowIfNullOrWhiteSpace(newPassword);
482 if (newPassword.Length < 8)
483 {
484 throw new InvalidOperationException("새 비밀번호는 8자 이상이어야 합니다.");
485 }
486
487 user.PasswordHash = DreaminePasswordHasher.HashPassword(newPassword);
488 await _database.UpdateAsync(user, cancellationToken).ConfigureAwait(false);
489 return user;
490 }

다음을 참조함 : _database, GetByIdAsync(), Dreamine.Identity.DreaminePasswordHasher.HashPassword(), LocalProvider, Dreamine.Identity.DreaminePasswordHasher.VerifyPassword().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ CreateLocalAsync()

async Task< AuthUser > Dreamine.Identity.SqliteUserStore.CreateLocalAsync ( string email,
string displayName,
string password,
CancellationToken cancellationToken = default )
inline

이메일을 정규화하고 중복 및 비밀번호 길이를 검증한 뒤 로컬 계정을 만듭니다.

매개변수
email로컬 계정 이메일입니다.
displayName선택적 표시 이름이며 비어 있으면 이메일을 사용합니다.
password해시할 평문 비밀번호입니다.
cancellationToken생성 취소 토큰입니다.
반환값
데이터베이스에서 다시 읽은 생성 사용자입니다.
예외
ArgumentNullExceptionemail 또는 passwordnull인 경우 발생합니다.
ArgumentExceptionemail 또는 password 가 비어 있거나 공백인 경우 발생합니다.
InvalidOperationException비밀번호가 8자 미만이거나 이메일이 이미 등록된 경우 발생합니다.

Dreamine.Identity.IUserStore를 구현.

SqliteUserStore.cs 파일의 564 번째 라인에서 정의되었습니다.

569 {
570 email = NormalizeEmail(email);
571 ArgumentException.ThrowIfNullOrWhiteSpace(password);
572
573 if (password.Length < 8)
574 {
575 throw new InvalidOperationException("비밀번호는 8자 이상이어야 합니다.");
576 }
577
578 var existing = await FindLocalByEmailAsync(email, cancellationToken).ConfigureAwait(false);
579 if (existing is not null)
580 {
581 throw new InvalidOperationException("이미 가입된 이메일입니다.");
582 }
583
584 var now = DateTime.UtcNow;
585 var user = new AuthUser
586 {
587 Provider = LocalProvider,
588 ProviderKey = email,
589 Email = email,
590 DisplayName = string.IsNullOrWhiteSpace(displayName) ? email : displayName.Trim(),
591 AvatarUrl = string.Empty,
592 PasswordHash = DreaminePasswordHasher.HashPassword(password),
593 CreatedAt = now,
594 LastLoginAt = now
595 };
596
597 await _database.InsertAsync(user, cancellationToken).ConfigureAwait(false);
598
599 return (await FindLocalByEmailAsync(email, cancellationToken).ConfigureAwait(false))!;
600 }

다음을 참조함 : _database, FindLocalByEmailAsync(), Dreamine.Identity.DreaminePasswordHasher.HashPassword(), LocalProvider, NormalizeEmail().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ EnsureSchema()

void Dreamine.Identity.SqliteUserStore.EnsureSchema ( )
inlineprivate

기존 Users 테이블에 비밀번호 및 필수 동의 열이 존재하도록 마이그레이션합니다.

SqliteUserStore.cs 파일의 740 번째 라인에서 정의되었습니다.

741 {
742 var columns = _database.Query<TableColumn>("PRAGMA table_info(Users)")
743 .Select(column => column.Name)
744 .ToHashSet(StringComparer.OrdinalIgnoreCase);
745
746 if (!columns.Contains(nameof(AuthUser.PasswordHash)))
747 {
748 _database.ExecuteNonQuery("ALTER TABLE Users ADD COLUMN PasswordHash TEXT NOT NULL DEFAULT ''");
749 }
750
751 AddNullableDateColumnIfMissing(columns, nameof(AuthUser.TermsAcceptedAtUtc));
752 AddNullableDateColumnIfMissing(columns, nameof(AuthUser.PrivacyPolicyAcceptedAtUtc));
753 AddNullableDateColumnIfMissing(columns, nameof(AuthUser.AgeConfirmedAtUtc));
754 }

다음을 참조함 : _database, AddNullableDateColumnIfMissing(), Dreamine.Identity.Models.AuthUser.AgeConfirmedAtUtc, Dreamine.Identity.Models.AuthUser.PasswordHash, Dreamine.Identity.Models.AuthUser.PrivacyPolicyAcceptedAtUtc, Dreamine.Identity.Models.AuthUser.TermsAcceptedAtUtc.

다음에 의해서 참조됨 : SqliteUserStore().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ FindLocalByEmailAsync()

async Task< AuthUser?> Dreamine.Identity.SqliteUserStore.FindLocalByEmailAsync ( string email,
CancellationToken cancellationToken )
inlineprivate

정규화된 이메일을 로컬 공급자 키로 사용해 사용자를 조회합니다.

매개변수
email정규화된 이메일입니다.
cancellationToken조회 취소 토큰입니다.
반환값
찾은 로컬 사용자 또는 없으면 null입니다.

SqliteUserStore.cs 파일의 718 번째 라인에서 정의되었습니다.

721 {
722 var rows = await _database.QueryAsync<AuthUser>(
723 "SELECT Id, Provider, ProviderKey, Email, DisplayName, AvatarUrl, PasswordHash, " +
724 "TermsAcceptedAtUtc, PrivacyPolicyAcceptedAtUtc, AgeConfirmedAtUtc, CreatedAt, LastLoginAt " +
725 "FROM Users WHERE Provider = @Provider AND ProviderKey = @ProviderKey LIMIT 1",
726 new { Provider = LocalProvider, ProviderKey = email },
727 cancellationToken).ConfigureAwait(false);
728
729 return rows.FirstOrDefault();
730 }

다음을 참조함 : _database, LocalProvider.

다음에 의해서 참조됨 : CreateLocalAsync(), ValidateLocalAsync().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ GetByIdAsync()

async Task< AuthUser?> Dreamine.Identity.SqliteUserStore.GetByIdAsync ( long id,
CancellationToken cancellationToken = default )
inline

내부 식별자로 사용자를 비동기 조회합니다.

매개변수
id내부 사용자 식별자입니다.
cancellationToken조회 취소 토큰입니다.
반환값
찾은 사용자 또는 없으면 null입니다.

Dreamine.Identity.IUserStore를 구현.

SqliteUserStore.cs 파일의 239 번째 라인에서 정의되었습니다.

240 {
241 var rows = await _database.QueryAsync<AuthUser>(
242 "SELECT Id, Provider, ProviderKey, Email, DisplayName, AvatarUrl, PasswordHash, " +
243 "TermsAcceptedAtUtc, PrivacyPolicyAcceptedAtUtc, AgeConfirmedAtUtc, CreatedAt, LastLoginAt " +
244 "FROM Users WHERE Id = @Id LIMIT 1",
245 new { Id = id },
246 cancellationToken).ConfigureAwait(false);
247
248 return rows.FirstOrDefault();
249 }

다음을 참조함 : _database.

다음에 의해서 참조됨 : AcceptRequiredConsentsAsync(), ChangeLocalPasswordAsync(), UpdateDisplayNameAsync().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ NormalizeEmail()

string Dreamine.Identity.SqliteUserStore.NormalizeEmail ( string email)
inlinestaticprivate

이메일 양끝 공백을 제거하고 소문자 불변 문화권 형식으로 정규화합니다.

매개변수
email정규화할 이메일입니다.
반환값
정규화된 이메일입니다.
예외
ArgumentNullExceptionemailnull인 경우 발생합니다.
ArgumentExceptionemail 이 비어 있거나 공백인 경우 발생합니다.

SqliteUserStore.cs 파일의 828 번째 라인에서 정의되었습니다.

829 {
830 ArgumentException.ThrowIfNullOrWhiteSpace(email);
831 return email.Trim().ToLowerInvariant();
832 }

다음에 의해서 참조됨 : CreateLocalAsync(), ValidateLocalAsync().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ UpdateDisplayNameAsync()

async Task< AuthUser?> Dreamine.Identity.SqliteUserStore.UpdateDisplayNameAsync ( long id,
string displayName,
CancellationToken cancellationToken = default )
inline

사용자의 공백 제거된 표시 이름을 갱신합니다.

매개변수
id내부 사용자 식별자입니다.
displayName저장할 표시 이름입니다.
cancellationToken갱신 취소 토큰입니다.
반환값
갱신된 사용자 또는 없으면 null입니다.
예외
NullReferenceExceptiondisplayNamenull인 경우 발생합니다.
InvalidOperationException공백을 제거한 표시 이름이 비어 있는 경우 발생합니다.

Dreamine.Identity.IUserStore를 구현.

SqliteUserStore.cs 파일의 307 번째 라인에서 정의되었습니다.

311 {
312 var user = await GetByIdAsync(id, cancellationToken).ConfigureAwait(false);
313 if (user is null)
314 {
315 return null;
316 }
317
318 displayName = displayName.Trim();
319 if (string.IsNullOrWhiteSpace(displayName))
320 {
321 throw new InvalidOperationException("표시 이름을 입력해 주세요.");
322 }
323
324 user.DisplayName = displayName;
325 await _database.UpdateAsync(user, cancellationToken).ConfigureAwait(false);
326 return user;
327 }

다음을 참조함 : _database, GetByIdAsync().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ UpsertAsync()

async Task< AuthUser > Dreamine.Identity.SqliteUserStore.UpsertAsync ( string provider,
string providerKey,
string email,
string displayName,
string avatarUrl,
CancellationToken cancellationToken = default )
inline

외부 공급자 키로 사용자를 추가하거나 프로필과 마지막 로그인 시각을 갱신합니다.

매개변수
provider로그인 공급자 이름입니다.
providerKey공급자 사용자 키입니다.
email사용자 이메일입니다.
displayName사용자 표시 이름입니다.
avatarUrl프로필 이미지 URL입니다.
cancellationToken저장 취소 토큰입니다.
반환값
저장된 최신 사용자 레코드입니다.
예외
ArgumentNullExceptionprovider 또는 providerKeynull인 경우 발생합니다.
ArgumentExceptionprovider 또는 providerKey 가 비어 있거나 공백인 경우 발생합니다.

Dreamine.Identity.IUserStore를 구현.

SqliteUserStore.cs 파일의 160 번째 라인에서 정의되었습니다.

167 {
168 ArgumentException.ThrowIfNullOrWhiteSpace(provider);
169 ArgumentException.ThrowIfNullOrWhiteSpace(providerKey);
170
171 var now = DateTime.UtcNow;
172 var existing = (await _database.QueryAsync<AuthUser>(
173 SelectSql,
174 new { Provider = provider, ProviderKey = providerKey },
175 cancellationToken).ConfigureAwait(false)).FirstOrDefault();
176
177 if (existing is not null)
178 {
179 existing.Email = email ?? string.Empty;
180 existing.DisplayName = displayName ?? string.Empty;
181 existing.AvatarUrl = avatarUrl ?? string.Empty;
182 existing.LastLoginAt = now;
183 await _database.UpdateAsync(existing, cancellationToken).ConfigureAwait(false);
184 return existing;
185 }
186
187 var created = new AuthUser
188 {
189 Provider = provider,
190 ProviderKey = providerKey,
191 Email = email ?? string.Empty,
192 DisplayName = displayName ?? string.Empty,
193 AvatarUrl = avatarUrl ?? string.Empty,
194 PasswordHash = string.Empty,
195 CreatedAt = now,
196 LastLoginAt = now
197 };
198
199 await _database.InsertAsync(created, cancellationToken).ConfigureAwait(false);
200
201 return (await _database.QueryAsync<AuthUser>(
202 SelectSql,
203 new { Provider = provider, ProviderKey = providerKey },
204 cancellationToken).ConfigureAwait(false)).First();
205 }

다음을 참조함 : _database, SelectSql.

◆ ValidateLocalAsync()

async Task< AuthUser?> Dreamine.Identity.SqliteUserStore.ValidateLocalAsync ( string email,
string password,
CancellationToken cancellationToken = default )
inline

로컬 이메일과 비밀번호를 검증하고 마지막 로그인 및 필요한 해시 업그레이드를 저장합니다.

매개변수
email정규화할 이메일입니다.
password검증할 평문 비밀번호입니다.
cancellationToken검증 취소 토큰입니다.
반환값
인증된 사용자 또는 실패하면 null입니다.
예외
ArgumentNullExceptionemailnull인 경우 발생합니다.
ArgumentExceptionemail 이 비어 있거나 공백인 경우 발생합니다.

Dreamine.Identity.IUserStore를 구현.

SqliteUserStore.cs 파일의 658 번째 라인에서 정의되었습니다.

662 {
663 email = NormalizeEmail(email);
664 var user = await FindLocalByEmailAsync(email, cancellationToken).ConfigureAwait(false);
665 if (user is null)
666 {
667 return null;
668 }
669
670 var verification = DreaminePasswordHasher.VerifyPassword(password, user.PasswordHash, out var upgradedHash);
671 if (verification is PasswordHashVerificationResult.Failed)
672 {
673 return null;
674 }
675
676 user.LastLoginAt = DateTime.UtcNow;
677 if (verification is PasswordHashVerificationResult.SuccessRehashNeeded && upgradedHash is not null)
678 {
679 user.PasswordHash = upgradedHash;
680 }
681
682 await _database.UpdateAsync(user, cancellationToken).ConfigureAwait(false);
683 return user;
684 }

다음을 참조함 : _database, FindLocalByEmailAsync(), NormalizeEmail(), Dreamine.Identity.DreaminePasswordHasher.VerifyPassword().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

멤버 데이터 문서화

◆ _database

readonly IDatabaseProvider Dreamine.Identity.SqliteUserStore._database
private

◆ LocalProvider

const string Dreamine.Identity.SqliteUserStore.LocalProvider = "Local"
staticprivate

Local Provider 값을 보관합니다.

SqliteUserStore.cs 파일의 37 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : ChangeLocalPasswordAsync(), CreateLocalAsync(), FindLocalByEmailAsync().

◆ SelectSql

const string Dreamine.Identity.SqliteUserStore.SelectSql
staticprivate
초기값:
=
"SELECT Id, Provider, ProviderKey, Email, DisplayName, AvatarUrl, PasswordHash, " +
"TermsAcceptedAtUtc, PrivacyPolicyAcceptedAtUtc, AgeConfirmedAtUtc, CreatedAt, LastLoginAt " +
"FROM Users WHERE Provider = @Provider AND ProviderKey = @ProviderKey LIMIT 1"

Select Sql 값을 보관합니다.

SqliteUserStore.cs 파일의 24 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : UpsertAsync().


이 클래스에 대한 문서화 페이지는 다음의 파일로부터 생성되었습니다.: