我有一组将要创建的测试帐户,但帐户将设置为在首次登录时要求更改密码.我想用C#编写一个程序来浏览测试帐户并更改密码.
我正在研究一种在Active Directory中更新用户密码的简单解决方案.
我可以成功更新用户密码.更新密码工作正常.假设用户已将密码从MyPass1更新为MyPass2
现在,当我运行自定义代码以验证用户凭据时使用:
using(PrincipalContext pc = new PrincipalContext(ContextType.Domain, "TheDomain"))
{
// validate the credentials
bool isValid = pc.ValidateCredentials("myuser", "MyPass2");
}
//returns true - which is good
Run Code Online (Sandbox Code Playgroud)
现在,当我输入一些错误的密码时,它会很好地验证:
using(PrincipalContext pc = new PrincipalContext(ContextType.Domain, "TheDomain"))
{
// validate the credentials
bool isValid = pc.ValidateCredentials("myuser", "wrongPass");
}
//returns false - which is good
Run Code Online (Sandbox Code Playgroud)
现在由于一些奇怪的原因,它验证了以前的最后一个密码是MyPass1还记得吗?
using(PrincipalContext pc = new PrincipalContext(ContextType.Domain, "TheDomain"))
{
// validate the credentials
bool isValid = pc.ValidateCredentials("myuser", "MyPass1");
}
//returns true - but why? we have updated password to …Run Code Online (Sandbox Code Playgroud) 我已经阅读了关于这个主题的几个问题,比如这里,这里,这里和这里 ; 但在我的案例中没有一个提供了有效的解决方案.
我想做的事:
为仅由我们自己的员工使用的Web应用程序实施Windows身份验证.这样他们就不需要登录应用程序,但已经通过登录Windows进行身份验证.
此外,我需要根据用户可能分配到的Active Directory安全组来限制应用程序的某些区域.
所以我希望能够装饰Controllers/Actions
[Authorize(Roles="SomeRole")]
Run Code Online (Sandbox Code Playgroud)
我尝试过的:
我有
<authentication mode="Windows" />
Run Code Online (Sandbox Code Playgroud)
在我的web.config中.我<roleManager>在上面链接的一些帖子中添加了几个a的排列.目前我有这个角色经理
<roleManager defaultProvider="WindowsProvider"
enabled="true"
cacheRolesInCookie="false">
<providers>
<add
name="WindowsProvider"
type="System.Web.Security.WindowsTokenRoleProvider" />
</providers>
</roleManager>
Run Code Online (Sandbox Code Playgroud)
在这篇文章中找到.
事实上,如果我装饰一个控制器[Authorize],我可以很好地访问它.
然而:
我可以在网络上的用户设置中看到,我是名为"IT"的AD安全组的成员.但是,如果我装饰相同的控制器,[Authorize(Roles="IT")]我得到的是由asp.net开发服务器为未授权的401服务的空白屏幕. 这是出乎意料的. 我认为我应该能够查看页面,因为我登录到Windows并且是"IT"组的一部分.
我在这个主题上发现的大部分内容都让我觉得很难完成我想要做的事情,但我在这里显然遗漏了一些东西.
我从过去发现了很多信息,说LDAP身份验证尚未启用,但您可以使用第三方软件包解决这个问题. 但是,似乎在1月份实施了LDAP身份验证WAS .我似乎无法找到任何关于如何实现它的信息.
我已经在我的项目中设置了自定义身份验证,我只需要逻辑来填写HandleAuthenticateAsync方法.
我尝试过使用其他示例,但它们似乎不适用于.NET Core 2.0.
这是我能想到的唯一相关代码
protected override Task<AuthenticateResult> HandleAuthenticateAsync()
{
// Get Authorization header value
if (!Request.Headers.TryGetValue(HeaderNames.Authorization, out var authorization)) {
return Task.FromResult(AuthenticateResult.Fail("Cannot read authorization header."));
}
// TODO: Authenticate user
// Create authenticated user ticket
var identities = new List<ClaimsIdentity> { new ClaimsIdentity("custom auth type") };
var ticket = new AuthenticationTicket(new ClaimsPrincipal(identities), Options.Scheme);
return Task.FromResult(AuthenticateResult.Success(ticket));
// else User not authenticated
return Task.FromResult(AuthenticateResult.Fail("Invalid auth key."));
}
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是,如何在.NET Core …
这可能吗?代码示例会很好.
我希望得到一个用户在Active Directory中成为其成员的所有组的列表,这两个组都明确列在memberOf属性列表中,也隐式通过嵌套组成员身份列出.例如,如果我检查UserA并且UserA是GroupA和GroupB的一部分,我还想列出GroupC,如果GroupB是GroupC的成员.
为了让您更深入地了解我的应用程序,我将在有限的基础上进行此操作.基本上,我偶尔会想要进行安全检查,以便列出这些额外的会员资格.我想区分这两者,但这应该不难.
我的问题是我没有找到一种有效的方法来使这个查询工作.Active Directory上的标准文本(此CodeProject文章)显示了一种基本上是递归查找的方法.这似乎非常低效.即使在我的小域中,用户也可能拥有30多个组成员资格.这意味着为一个用户调用30多个Active Directory.
我查看了以下LDAP代码,以便一次获取所有memberOf条目:
(memberOf:1.2.840.113556.1.4.1941:={0})
Run Code Online (Sandbox Code Playgroud)
其中{0}将是我的LDAP路径(例如:CN = UserA,OU = Users,DC = foo,DC = org).但是,它不会返回任何记录.这种方法的缺点,即使它起作用,也就是我不知道哪个组是明确的,哪个是隐含的.
这就是我到目前为止所拥有的.我想知道是否有比CodeProject文章更好的方法,如果有的话,如何实现(实际代码将是美好的).我使用的是.NET 4.0和C#.我的Active Directory处于Windows 2008功能级别(它还不是R2).
Azure Active Directory是Azure提供的"即服务".我见过Microsoft的文档和内容,说明可以用于SSO和其他Web应用程序进行统一身份验证.
是否可以使用Azure Active Directory替换虚拟网络中Azure虚拟机中的Windows Server AD?我看到Azure VM上的Windows Server Active Directory安装涉及PowerShell和其他东西的执行?
active-directory azure azure-virtual-machine azure-virtual-network azure-active-directory
我正在使用asp.net mvc实现企业网站,并希望使用新的ASP.NET身份框架.是否可以将ActiveDirectory授权与ASP.NET标识集成?任何样品怎么做?
我希望我的桌面Java应用程序能够与Active Directory用户进行单点登录.分两步,我想:
使用Java:确定当前Windows用户的程序方法我可以获得当前Windows用户的名称,但我可以依赖它吗?我觉得
System.getProperty("user.name")
Run Code Online (Sandbox Code Playgroud)
会不够安全?("user.name"似乎来自环境变量,所以我不能依赖它,我想?)
问题在Linux上使用Java对Active Directory进行 身份验证为我提供了给定名称+ pass的身份验证,但我想根据Windows登录进行身份验证?
对于Active Directory访问,LDAP可能是选择?
我不完全确定我是否提出了正确的问题,但希望有人有一些想法可以转发我.
我使用的是Weblogic,Ejb3.0.Java 1.6
我需要通过Java代码访问Active Directory.我读了几种方法(Kerberos,LDAP)
任何人都可以建议我这样做的舒适方式?我在哪里可以找到一些完整的代码示例,
谢谢,雷.
active-directory ×10
c# ×5
.net ×2
java ×2
ldap ×2
asp.net ×1
asp.net-core ×1
asp.net-mvc ×1
azure ×1
java-ee ×1
kerberos ×1