gpt4 book ai didi

c# - 在 Angular 应用程序中针对本地 AD 进行身份验证

转载 作者:行者123 更新时间:2023-12-03 23:51:45 25 4
gpt4 key购买 nike

我一直在开发带有 .NET Core 后端(服务)的 Angular 应用程序。任务是启用集成身份验证,即使其与本地用户无缝协作,因此我登录到我的(连接到本地 AD)机器一次,Web 应用程序让我无需再次登录即可进入。我们一直在使用 Identity Server 4 并打算使用它来实现这个场景。

官方网站上有一些关于 Windows 身份验证(例如针对 Active Directory)的文档:http://docs.identityserver.io/en/latest/topics/windows.html但它并没有解释太多。根据我的信息,为了使这个场景工作,浏览器使用 Kerberos 或 NTLM。 IS4 文档中没有提到它们。我不了解如何获取本地凭据以及 IS4 如何“知道”用户属于 AD?如何确保只有来自特定域的用户才能访问我的应用程序?

我在这里找到了一些有用的东西 https://github.com/damienbod/AspNetCoreWindowsAuth但问题保持不变。即使我能够使用本地帐户访问该应用程序,我也不了解流程。

我希望在本地网络中使用该应用程序的用户无需输入登录名/密码即可登录该应用程序(一旦他已经登录到 Windows)。这是可以实现的吗?

最佳答案

Identity Server 旨在充当身份提供者,如果您需要与 AD 交谈,您应该看到他们使用 IAuthenticationSchemeProvider 提出的联合网关架构。 Identity Server 充当端点并与您的 AD 对话。

这是链接:

http://docs.identityserver.io/en/latest/topics/federation_gateway.html

您可以控制以编程方式访问您的 AD 并传递正确的凭据以获得身份验证。该步骤应该在您的身份服务器中完成。在您通过身份验证后,您应该再次重定向到您的应用程序。
关于您的最后一个问题,答案是肯定的,如果您的网站托管在 Intranet 上并且您可以访问您的 AD,则您不需要捕获您的凭据作为用户输入,您可以像我说的那样以编程方式访问 AD .

波纹管是我用来连接我的事件目录的代码

在 ExternalController 类上,当您使用 IdentityServer 时,您会得到:(我不记得我从原始代码中更改了多少,但您应该明白了)

    /// <summary>
/// initiate roundtrip to external authentication provider
/// </summary>
[HttpGet]
public async Task<IActionResult> Challenge(string provider, string returnUrl)
{
if (string.IsNullOrEmpty(returnUrl)) returnUrl = "~/";

// validate returnUrl - either it is a valid OIDC URL or back to a local page
if (Url.IsLocalUrl(returnUrl) == false && _interaction.IsValidReturnUrl(returnUrl) == false)
{
// user might have clicked on a malicious link - should be logged
throw new Exception("invalid return URL");
}

if (AccountOptions.WindowsAuthenticationSchemeName == provider)
{
// windows authentication needs special handling
return await ProcessWindowsLoginAsync(returnUrl);
}
else
{
// start challenge and roundtrip the return URL and scheme
var props = new AuthenticationProperties
{
RedirectUri = Url.Action(nameof(Callback)),
Items =
{
{ "returnUrl", returnUrl },
{ "scheme", provider },
}
};

return Challenge(props, provider);
}
}

private async Task<IActionResult> ProcessWindowsLoginAsync(string returnUrl)
{
// see if windows auth has already been requested and succeeded
var result = await HttpContext.AuthenticateAsync(AccountOptions.WindowsAuthenticationSchemeName);
if (result?.Principal is WindowsPrincipal wp)
{
// we will issue the external cookie and then redirect the
// user back to the external callback, in essence, testing windows
// auth the same as any other external authentication mechanism
var props = new AuthenticationProperties()
{
RedirectUri = Url.Action("Callback"),
Items =
{
{ "returnUrl", returnUrl },
{ "scheme", AccountOptions.WindowsAuthenticationSchemeName },
}
};

var id = new ClaimsIdentity(AccountOptions.WindowsAuthenticationSchemeName);
id.AddClaim(new Claim(JwtClaimTypes.Subject, wp.Identity.Name));
id.AddClaim(new Claim(JwtClaimTypes.Name, wp.Identity.Name));

// add the groups as claims -- be careful if the number of groups is too large
if (AccountOptions.IncludeWindowsGroups)
{
var wi = wp.Identity as WindowsIdentity;
var groups = wi.Groups.Translate(typeof(NTAccount));
var roles = groups.Select(x => new Claim(JwtClaimTypes.Role, x.Value));
id.AddClaims(roles);
}

await HttpContext.SignInAsync(
IdentityServer4.IdentityServerConstants.ExternalCookieAuthenticationScheme,
new ClaimsPrincipal(id),
props);
return Redirect(props.RedirectUri);
}
else
{
// trigger windows auth
// since windows auth don't support the redirect uri,
// this URL is re-triggered when we call challenge
return Challenge(AccountOptions.WindowsAuthenticationSchemeName);
}
}

如果你想使用 Azure AD,我建议你阅读这篇文章:
https://damienbod.com/2019/05/17/updating-microsoft-account-logins-in-asp-net-core-with-openid-connect-and-azure-active-directory/

关于c# - 在 Angular 应用程序中针对本地 AD 进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56552430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com