diff --git a/ZB.MOM.WW.Theme/build/pack.sh b/ZB.MOM.WW.Theme/build/pack.sh
index 471e865..c166ead 100755
--- a/ZB.MOM.WW.Theme/build/pack.sh
+++ b/ZB.MOM.WW.Theme/build/pack.sh
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
-# pack.sh — produce the ZB.MOM.WW.Auth NuGet packages into ./artifacts.
+# pack.sh — produce the ZB.MOM.WW.Theme NuGet packages into ./artifacts.
#
# Usage:
# ./build/pack.sh
diff --git a/ZB.MOM.WW.Theme/build/push.sh b/ZB.MOM.WW.Theme/build/push.sh
index c4a2a55..cd1ce5d 100755
--- a/ZB.MOM.WW.Theme/build/push.sh
+++ b/ZB.MOM.WW.Theme/build/push.sh
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
-# push.sh — pack and push all ZB.MOM.WW.Auth NuGet packages to the Gitea feed.
+# push.sh — pack and push all ZB.MOM.WW.Theme NuGet packages to the Gitea feed.
#
# Required environment variables:
# GITEA_NUGET_SOURCE — full URL of the Gitea NuGet feed
diff --git a/ZB.MOM.WW.Theme/src/ZB.MOM.WW.Theme/Components/LoginCard.razor b/ZB.MOM.WW.Theme/src/ZB.MOM.WW.Theme/Components/LoginCard.razor
index 4cfc8fd..0f6fb3e 100644
--- a/ZB.MOM.WW.Theme/src/ZB.MOM.WW.Theme/Components/LoginCard.razor
+++ b/ZB.MOM.WW.Theme/src/ZB.MOM.WW.Theme/Components/LoginCard.razor
@@ -1,5 +1,10 @@
@namespace ZB.MOM.WW.Theme
-@* Components/LoginCard.razor — static form-POST sign-in card. *@
+@* Components/LoginCard.razor — static form-POST sign-in card.
+ SECURITY NOTES:
+ - ReturnUrl is echoed into a hidden field verbatim; the consuming app's POST handler
+ MUST validate it is a local/relative URL before redirecting to prevent open-redirect.
+ - This form is NOT auto-protected by Blazor antiforgery; the caller MUST pass an
+ antiforgery token via ChildContent (e.g. ). *@
@@ -33,7 +38,21 @@
@code {
[Parameter, EditorRequired] public string Product { get; set; } = string.Empty;
[Parameter] public string Action { get; set; } = "/auth/login";
+
+ ///
+ /// Optional URL to redirect to after a successful login. Echoed into a hidden
+ /// returnUrl field. The consuming app's POST handler MUST validate this is
+ /// a local/relative URL before redirecting — do not redirect to arbitrary values
+ /// to prevent open-redirect vulnerabilities.
+ ///
[Parameter] public string? ReturnUrl { get; set; }
+
[Parameter] public string? Error { get; set; }
+
+ ///
+ /// Content rendered inside the form, before the username/password fields.
+ /// The caller MUST supply an antiforgery token here (e.g. <AntiforgeryToken />)
+ /// because this static POST form is not auto-protected by Blazor's antiforgery middleware.
+ ///
[Parameter] public RenderFragment? ChildContent { get; set; }
}
diff --git a/ZB.MOM.WW.Theme/src/ZB.MOM.WW.Theme/Components/TechButton.razor b/ZB.MOM.WW.Theme/src/ZB.MOM.WW.Theme/Components/TechButton.razor
index c97acb7..871db30 100644
--- a/ZB.MOM.WW.Theme/src/ZB.MOM.WW.Theme/Components/TechButton.razor
+++ b/ZB.MOM.WW.Theme/src/ZB.MOM.WW.Theme/Components/TechButton.razor
@@ -1,6 +1,6 @@
@namespace ZB.MOM.WW.Theme
@* Components/TechButton.razor *@
-