Dreamine.Identity 1.0.0.0
Dreamine.Identity 프로젝트의 API와 구성 요소를 제공합니다.
로딩중...
검색중...
일치하는것 없음
Dreamine.Identity.Internal 네임스페이스 참조

클래스

class  AuthEndpoints
class  RequiredConsentPolicy

함수

</script ></body ></html > return builder. ToString ()
static string BuildConsentHtml (string returnUrl, string? error, string routePrefix)
static string BuildAccountHtml (AuthUser user, string returnUrl, string? message, string? error, string routePrefix="")
static string Html (string? value)
static string Url (string? value)
static bool IsEmbeddedMobileBrowser (string userAgent)

함수 문서화

◆ BuildAccountHtml()

string Dreamine.Identity.Internal.BuildAccountHtml ( AuthUser user,
string returnUrl,
string? message,
string? error,
string routePrefix = "" )
staticprivate

사용자 프로필과 로그인 방식에 맞는 계정 관리 HTML을 만듭니다.

매개변수
user표시할 사용자입니다.
returnUrl계정 화면에서 돌아갈 안전한 URL입니다.
message선택적 성공 메시지입니다.
error선택적 오류 메시지입니다.
routePrefix폼 및 링크 경로 접두사입니다.
반환값
완성된 계정 HTML입니다.

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

1396 {
1397 var accountPath = $"{routePrefix}/account";
1398 var signoutPath = $"{routePrefix}/signout";
1399 var provider = string.IsNullOrWhiteSpace(user.Provider) ? "Unknown" : user.Provider;
1400 var email = string.IsNullOrWhiteSpace(user.Email) ? "제공되지 않음" : user.Email;
1401 var isLocal = string.Equals(user.Provider, LocalProvider, StringComparison.OrdinalIgnoreCase);
1402 var avatar = string.IsNullOrWhiteSpace(user.AvatarUrl)
1403 ? "<div class=\"avatar-fallback\">U</div>"
1404 : $"""<img class="avatar" src="{Html(user.AvatarUrl)}" alt="" />""";
1405 var passwordSection = isLocal
1406 ? $$"""
1407 <section>
1408 <h2>비밀번호 변경</h2>
1409 <form method="post" action="{{accountPath}}">
1410 <input type="hidden" name="returnUrl" value="{{Html(returnUrl)}}" />
1411 <input type="hidden" name="accountAction" value="password" />
1412 <label for="currentPassword">현재 비밀번호</label>
1413 <input id="currentPassword" name="currentPassword" type="password" autocomplete="current-password" required />
1414 <label for="newPassword">새 비밀번호</label>
1415 <input id="newPassword" name="newPassword" type="password" autocomplete="new-password" required minlength="8" />
1416 <label for="confirmPassword">새 비밀번호 확인</label>
1417 <input id="confirmPassword" name="confirmPassword" type="password" autocomplete="new-password" required minlength="8" />
1418 <button type="submit">비밀번호 변경</button>
1419 </form>
1420 </section>
1421 """
1422 : $$"""
1423 <section>
1424 <h2>비밀번호</h2>
1425 <p class="note">{{Html(provider)}} 로그인 계정은 CodeMaru에 별도 비밀번호가 없습니다. 비밀번호 변경은 해당 로그인 제공자에서 진행해 주세요.</p>
1426 </section>
1427 """;
1428
1429 var builder = new StringBuilder();
1430 builder.Append($$"""
1431 <!DOCTYPE html>
1432 <html lang="ko">
1433 <head>
1434 <meta charset="utf-8" />
1435 <meta name="viewport" content="width=device-width, initial-scale=1" />
1436 <title>내 계정 | Dreamine Identity</title>
1437 <style>
1438 :root { color-scheme: dark; }
1439 * { box-sizing: border-box; }
1440 body {
1441 margin: 0;
1442 min-height: 100vh;
1443 display: grid;
1444 place-items: center;
1445 font-family: "Segoe UI", Arial, sans-serif;
1446 background: #0f172a;
1447 color: #e5e7eb;
1448 }
1449 main {
1450 width: min(480px, calc(100vw - 32px));
1451 padding: 28px;
1452 border: 1px solid rgba(148, 163, 184, .28);
1453 border-radius: 8px;
1454 background: #111827;
1455 box-shadow: 0 24px 80px rgba(0, 0, 0, .36);
1456 }
1457 .head { display: flex; align-items: center; gap: 14px; margin-bottom: 18px; }
1458 .avatar, .avatar-fallback {
1459 width: 54px;
1460 height: 54px;
1461 border-radius: 50%;
1462 object-fit: cover;
1463 display: grid;
1464 place-items: center;
1465 background: #1e293b;
1466 color: #cbd5e1;
1467 font-weight: 800;
1468 }
1469 h1 { margin: 0; font-size: 28px; letter-spacing: 0; }
1470 h2 { margin: 0 0 12px; font-size: 18px; letter-spacing: 0; }
1471 p { margin: 6px 0 0; color: #94a3b8; line-height: 1.5; }
1472 section { margin-top: 22px; padding-top: 20px; border-top: 1px solid #263244; }
1473 dl { display: grid; gap: 10px; margin: 20px 0; }
1474 div.row {
1475 display: grid;
1476 grid-template-columns: 110px minmax(0, 1fr);
1477 gap: 12px;
1478 padding: 10px 0;
1479 border-bottom: 1px solid #263244;
1480 }
1481 dt { color: #94a3b8; }
1482 dd { margin: 0; overflow-wrap: anywhere; }
1483 label { display: block; margin: 16px 0 6px; color: #cbd5e1; font-size: 14px; }
1484 input {
1485 width: 100%;
1486 height: 44px;
1487 padding: 0 12px;
1488 border: 1px solid #334155;
1489 border-radius: 6px;
1490 background: #0b1220;
1491 color: #f8fafc;
1492 font-size: 15px;
1493 }
1494 .actions { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; margin-top: 18px; }
1495 button, a.button {
1496 display: flex;
1497 height: 44px;
1498 align-items: center;
1499 justify-content: center;
1500 border-radius: 6px;
1501 text-decoration: none;
1502 font-weight: 700;
1503 }
1504 button { border: 0; background: #e5e7eb; color: #0f172a; cursor: pointer; }
1505 a.button { border: 1px solid #334155; color: #e5e7eb; }
1506 form > button { width: 100%; margin-top: 18px; }
1507 .note {
1508 padding: 12px;
1509 border: 1px solid #334155;
1510 border-radius: 6px;
1511 background: #0b1220;
1512 }
1513 .message, .error {
1514 padding: 10px 12px;
1515 border-radius: 6px;
1516 margin: 14px 0;
1517 line-height: 1.45;
1518 }
1519 .message { background: rgba(14, 165, 233, .12); color: #bae6fd; }
1520 .error { background: rgba(239, 68, 68, .14); color: #fecaca; }
1521 </style>
1522 </head>
1523 <body>
1524 <main>
1525 <div class="head">
1526 {{avatar}}
1527 <div>
1528 <h1>내 계정</h1>
1529 <p>CodeMaru 및 Dreamine 계열 서비스에서 사용할 기본 정보를 관리합니다.</p>
1530 </div>
1531 </div>
1532 """);
1533
1534 if (!string.IsNullOrWhiteSpace(message))
1535 {
1536 builder.Append($"""<div class="message">{Html(message)}</div>""");
1537 }
1538
1539 if (!string.IsNullOrWhiteSpace(error))
1540 {
1541 builder.Append($"""<div class="error">{Html(error)}</div>""");
1542 }
1543
1544 builder.Append($$"""
1545 <dl>
1546 <div class="row"><dt>로그인 방식</dt><dd>{{Html(provider)}}</dd></div>
1547 <div class="row"><dt>이메일</dt><dd>{{Html(email)}}</dd></div>
1548 </dl>
1549 <form method="post" action="{{accountPath}}">
1550 <input type="hidden" name="returnUrl" value="{{Html(returnUrl)}}" />
1551 <input type="hidden" name="accountAction" value="profile" />
1552 <label for="displayName">표시 이름</label>
1553 <input id="displayName" name="displayName" autocomplete="name" required value="{{Html(user.DisplayName)}}" />
1554 <div class="actions">
1555 <button type="submit">저장</button>
1556 <a class="button" href="{{Html(returnUrl)}}">돌아가기</a>
1557 <a class="button" href="{{signoutPath}}?returnUrl={{Url(returnUrl)}}">로그아웃</a>
1558 </div>
1559 </form>
1560 {{passwordSection}}
1561 </main>
1562 </body>
1563 </html>
1564 """);
1565
1566 return builder.ToString();
1567 }
static string Url(string? value)
static string Html(string? value)

◆ BuildConsentHtml()

string Dreamine.Identity.Internal.BuildConsentHtml ( string returnUrl,
string? error,
string routePrefix )
staticprivate

이용약관, 개인정보 및 연령 확인 입력을 포함한 필수 동의 HTML을 만듭니다.

매개변수
returnUrl동의 후 이동할 안전한 URL입니다.
error선택적 오류 메시지입니다.
routePrefix폼 작업 경로 접두사입니다.
반환값
완성된 동의 HTML입니다.

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

1217 {
1218 var consentPath = $"{routePrefix}/consent";
1219 var builder = new StringBuilder();
1220 builder.Append($$"""
1221 <!DOCTYPE html>
1222 <html lang="ko">
1223 <head>
1224 <meta charset="utf-8" />
1225 <meta name="viewport" content="width=device-width, initial-scale=1" />
1226 <title>필수 동의 | Dreamine Identity</title>
1227 <style>
1228 :root { color-scheme: dark; }
1229 * { box-sizing: border-box; }
1230 body {
1231 margin: 0;
1232 min-height: 100vh;
1233 display: grid;
1234 place-items: center;
1235 font-family: "Segoe UI", Arial, sans-serif;
1236 background: #0f172a;
1237 color: #e5e7eb;
1238 }
1239 main {
1240 width: min(480px, calc(100vw - 32px));
1241 padding: 28px;
1242 border: 1px solid rgba(148, 163, 184, .28);
1243 border-radius: 8px;
1244 background: #111827;
1245 box-shadow: 0 24px 80px rgba(0, 0, 0, .36);
1246 }
1247 h1 { margin: 0 0 8px; font-size: 28px; letter-spacing: 0; }
1248 p { margin: 0 0 20px; color: #94a3b8; line-height: 1.5; }
1249 .error {
1250 padding: 10px 12px;
1251 border-radius: 6px;
1252 margin: 14px 0;
1253 background: rgba(239, 68, 68, .14);
1254 color: #fecaca;
1255 line-height: 1.45;
1256 }
1257 .consents {
1258 display: grid;
1259 gap: 12px;
1260 margin-top: 16px;
1261 padding: 14px;
1262 border: 1px solid #334155;
1263 border-radius: 6px;
1264 background: #0b1220;
1265 }
1266 label {
1267 display: flex;
1268 align-items: flex-start;
1269 gap: 10px;
1270 line-height: 1.45;
1271 color: #dbeafe;
1272 }
1273 input[type="checkbox"] {
1274 width: 18px;
1275 height: 18px;
1276 flex: 0 0 auto;
1277 accent-color: #93c5fd;
1278 }
1279 a { color: #93c5fd; }
1280 button {
1281 display: flex;
1282 width: 100%;
1283 height: 44px;
1284 align-items: center;
1285 justify-content: center;
1286 margin-top: 18px;
1287 border: 0;
1288 border-radius: 6px;
1289 background: #e5e7eb;
1290 color: #0f172a;
1291 cursor: pointer;
1292 font-weight: 700;
1293 }
1294 </style>
1295 </head>
1296 <body>
1297 <main>
1298 <h1>필수 동의</h1>
1299 <p>CodeMaru 및 Dreamine 계열 서비스를 계속 이용하려면 아래 항목을 확인해 주세요.</p>
1300 """);
1301
1302 if (!string.IsNullOrWhiteSpace(error))
1303 {
1304 builder.Append($"""<div class="error">{Html(error)}</div>""");
1305 }
1306
1307 builder.Append($$"""
1308 <form method="post" action="{{consentPath}}">
1309 <input type="hidden" name="returnUrl" value="{{Html(returnUrl)}}" />
1310 <div class="consents">
1311 <label>
1312 <input type="checkbox" name="termsAccepted" value="true" required />
1313 <span><a href="/terms" target="_blank" rel="noopener">이용약관</a>에 동의합니다.</span>
1314 </label>
1315 <label>
1316 <input type="checkbox" name="privacyAccepted" value="true" required />
1317 <span><a href="/privacy" target="_blank" rel="noopener">개인정보처리방침</a>을 확인했고 개인정보 수집·이용에 동의합니다.</span>
1318 </label>
1319 <label>
1320 <input type="checkbox" name="ageConfirmed" value="true" required />
1321 <span>만 14세 이상입니다. 만 14세 미만은 법정대리인 동의 절차 확인 전 온라인 가입을 진행할 수 없습니다.</span>
1322 </label>
1323 </div>
1324 <button type="submit">동의하고 계속</button>
1325 </form>
1326 </main>
1327 </body>
1328 </html>
1329 """);
1330
1331 return builder.ToString();
1332 }

◆ Html()

string Dreamine.Identity.Internal.Html ( string? value)
inlinestaticprivate

선택적 값을 HTML 텍스트 또는 특성에 안전하게 인코딩합니다.

매개변수
value인코딩할 값입니다.
반환값
HTML 인코딩된 문자열입니다.

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

1593=> WebUtility.HtmlEncode(value ?? string.Empty);

다음을 참조함 : Html().

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

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

◆ IsEmbeddedMobileBrowser()

bool Dreamine.Identity.Internal.IsEmbeddedMobileBrowser ( string userAgent)
staticprivate

사용자 에이전트가 알려진 모바일 앱 내부 브라우저인지 확인합니다.

매개변수
userAgent검사할 User-Agent 헤더 값입니다.
반환값
알려진 앱 내부 브라우저이면 true입니다.

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

1646 {
1647 if (string.IsNullOrWhiteSpace(userAgent))
1648 {
1649 return false;
1650 }
1651
1652 return userAgent.Contains("KAKAOTALK", StringComparison.OrdinalIgnoreCase)
1653 || userAgent.Contains("NAVER(inapp", StringComparison.OrdinalIgnoreCase)
1654 || userAgent.Contains("FBAN", StringComparison.OrdinalIgnoreCase)
1655 || userAgent.Contains("FBAV", StringComparison.OrdinalIgnoreCase)
1656 || userAgent.Contains("Instagram", StringComparison.OrdinalIgnoreCase)
1657 || userAgent.Contains("Line/", StringComparison.OrdinalIgnoreCase)
1658 || (userAgent.Contains("; wv)", StringComparison.OrdinalIgnoreCase)
1659 && userAgent.Contains("Android", StringComparison.OrdinalIgnoreCase));
1660 }

다음을 참조함 : IsEmbeddedMobileBrowser().

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

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

◆ ToString()

</script ></body ></html > return builder. Dreamine.Identity.Internal.ToString ( )

◆ Url()

string Dreamine.Identity.Internal.Url ( string? value)
inlinestaticprivate

선택적 값을 URL 쿼리 구성 요소로 이스케이프합니다.

매개변수
value이스케이프할 값입니다.
반환값
URL 이스케이프된 문자열입니다.

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

1619=> Uri.EscapeDataString(value ?? string.Empty);

다음을 참조함 : Url().

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

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