Remove redundant credential tile image

This commit is contained in:
2026-09-01 11:35:57 -06:00
parent f3afd62993
commit 3b5cf723cc
6 changed files with 15 additions and 39 deletions
+6 -1
View File
@@ -67,7 +67,12 @@ Every synchronized user also receives `Universidad La Salle` in the AD
The generic SGU credential is rendered as a dedicated branded tile instead of The generic SGU credential is rendered as a dedicated branded tile instead of
being grouped below the anonymous **Other user** tile. Machine policy assigns being grouped below the anonymous **Other user** tile. Machine policy assigns
the SGU CLSID as the default provider while retaining the built-in Microsoft the SGU CLSID as the default provider while retaining the built-in Microsoft
password provider. password provider. It enumerates one `CPFT_TILE_IMAGE` and places the
`CPFT_LARGE_TEXT` heading immediately after it with `CPFS_DISPLAY_IN_BOTH`,
matching Microsoft's supported field ordering. LogonUI owns field typography:
on Windows 10 and 11, the account-name title used by **Other user** is shell UI,
not a style that a generic Credential Provider can request. Do not add a second
tile image or a synthetic Windows account to imitate that title.
The managed hierarchy is rooted at `OU=Usuarios-SGU`: `Docentes`, `Alumnos`, The managed hierarchy is rooted at `OU=Usuarios-SGU`: `Docentes`, `Alumnos`,
and `Administrativos` are direct child OUs beneath it. and `Administrativos` are direct child OUs beneath it.
@@ -4,7 +4,6 @@ internal static class ControlKeys
{ {
public const string ProviderLabel = "ProviderLabel"; public const string ProviderLabel = "ProviderLabel";
public const string ProviderLogo = "ProviderLogo"; public const string ProviderLogo = "ProviderLogo";
public const string UserTile = "UserTile";
public const string Heading = "Heading"; public const string Heading = "Heading";
public const string InformationLabel = "InformationLabel"; public const string InformationLabel = "InformationLabel";
public const string UserName = "UserName"; public const string UserName = "UserName";
@@ -7,7 +7,6 @@ namespace SGU.CredentialProvider;
internal static class ProviderTileIcon internal static class ProviderTileIcon
{ {
public const int Size = 72; public const int Size = 72;
public const int UserTileSize = 128;
public static Bitmap Create() public static Bitmap Create()
{ {
@@ -31,29 +30,4 @@ internal static class ProviderTileIcon
return bitmap; return bitmap;
} }
public static Bitmap CreateUserTile()
{
Bitmap bitmap = new(UserTileSize, UserTileSize, PixelFormat.Format32bppArgb);
using Graphics graphics = Graphics.FromImage(bitmap);
graphics.SmoothingMode = SmoothingMode.AntiAlias;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
graphics.Clear(Color.FromArgb(0, 83, 155));
using Pen border = new(Color.FromArgb(190, 221, 241), 5f);
using Pen key = new(Color.White, 9f)
{
StartCap = LineCap.Round,
EndCap = LineCap.Round,
LineJoin = LineJoin.Round
};
graphics.DrawEllipse(border, 7, 7, 113, 113);
graphics.DrawEllipse(key, 25, 25, 43, 43);
graphics.DrawLine(key, 62, 62, 99, 99);
graphics.DrawLine(key, 82, 82, 95, 69);
graphics.DrawLine(key, 93, 93, 106, 80);
return bitmap;
}
} }
@@ -21,11 +21,10 @@ public sealed class SguCredentialProvider : CredentialProviderBase
ControlKeys.ProviderLogo, ControlKeys.ProviderLogo,
"Acceso institucional SGU", "Acceso institucional SGU",
ProviderTileIcon.Create()); ProviderTileIcon.Create());
yield return new UserTileControl( yield return new LargeLabelControl(ControlKeys.Heading, "Acceso institucional SGU")
ControlKeys.UserTile, {
"Universidad La Salle", State = FieldState.DisplayInBoth
ProviderTileIcon.CreateUserTile()); };
yield return new LargeLabelControl(ControlKeys.Heading, "Acceso institucional SGU");
yield return new SmallLabelControl( yield return new SmallLabelControl(
ControlKeys.InformationLabel, ControlKeys.InformationLabel,
"Usa tu clave institucional (DO, AL o AD + 6 dígitos) y contraseña."); "Usa tu clave institucional (DO, AL o AD + 6 dígitos) y contraseña.");
@@ -16,7 +16,6 @@ internal static class Program
[ [
"Universidad La Salle · Acceso SGU", "Universidad La Salle · Acceso SGU",
"Acceso institucional SGU", "Acceso institucional SGU",
"Universidad La Salle",
"Acceso institucional SGU", "Acceso institucional SGU",
"Usa tu clave institucional (DO, AL o AD + 6 dígitos) y contraseña.", "Usa tu clave institucional (DO, AL o AD + 6 dígitos) y contraseña.",
"Clave institucional", "Clave institucional",
@@ -92,7 +91,7 @@ internal static class Program
credentialCount == 1 && credentialCount == 1 &&
credential != IntPtr.Zero && credential != IntPtr.Zero &&
providerLogoPresent && providerLogoPresent &&
userTilePresent && !userTilePresent &&
labels.SequenceEqual(ExpectedLabels, StringComparer.Ordinal); labels.SequenceEqual(ExpectedLabels, StringComparer.Ordinal);
if (mode != "enumeration" && passed) if (mode != "enumeration" && passed)
@@ -33,18 +33,18 @@ public sealed class ProviderTileIconTests
} }
[Fact] [Fact]
public void ProviderPublishesABrandedDedicatedUserTileAndHeading() public void ProviderPublishesASingleBrandedImageAndLargeHeading()
{ {
SguCredentialProvider provider = new(); SguCredentialProvider provider = new();
ControlBase[] controls = provider.GetControls(UsageScenario.Logon).ToArray(); ControlBase[] controls = provider.GetControls(UsageScenario.Logon).ToArray();
UserTileControl userTile = Assert.Single(controls.OfType<UserTileControl>()); Assert.Empty(controls.OfType<UserTileControl>());
Assert.Single(controls.OfType<CredentialProviderLogoControl>());
LargeLabelControl heading = Assert.Single(controls.OfType<LargeLabelControl>()); LargeLabelControl heading = Assert.Single(controls.OfType<LargeLabelControl>());
SguCredentialTile tile = Assert.IsType<SguCredentialTile>(provider.CreateGenericTile()); SguCredentialTile tile = Assert.IsType<SguCredentialTile>(provider.CreateGenericTile());
Assert.Equal(ProviderTileIcon.UserTileSize, userTile.Bitmap.Width);
Assert.Equal(ProviderTileIcon.UserTileSize, userTile.Bitmap.Height);
Assert.Equal("Acceso institucional SGU", heading.Label); Assert.Equal("Acceso institucional SGU", heading.Label);
Assert.Equal(FieldState.DisplayInBoth, heading.State);
Assert.Equal(GenericTileDisplayMode.DisplayAsDedicatedTile, tile.GenericTileDisplayMode); Assert.Equal(GenericTileDisplayMode.DisplayAsDedicatedTile, tile.GenericTileDisplayMode);
} }
} }