对于工作项目,我们有一个名为APC的中央应用程序,它处理内部应用程序的用户管理;它允许对用户,应用程序,权限和角色进行标准的CRUD操作。
此应用程序当前使用Active Directory进行身份验证,使用Windows Identity处理声明。它提供了一个DLL,其中包含我们在内部应用程序中使用的自定义授权属性。
企业希望APC能够处理非域身份验证(用户名和密码),他们也希望能够支持移动设备。为此,我们决定让我们的应用程序直接处理身份验证,并使其成为OAuth提供商;除了域登录之外,我们还会扩展用户持久性以处理用户名和密码,并提供承载令牌以支持多种应用程序类型。
通过我的研究,我发现使用OWIN创建具有基本身份验证的OAuth提供程序的好文章,例如this one。我还发现了微软的Active Directory Authentication Library (ADAL),它显然会处理OAuth部分。但是,我不确定如何在我们的提供程序中结合这两种身份验证类型。 (事实上,虽然我理解身份验证,但我并不熟悉.NET应用程序如何与Active Directory一起使用。通常,它在web.config中是一个标记,它只是起作用 - 我我真的不知道如何利用这条管道。)
如何使用Active Directory以用户名和密码组合作为后备进行身份验证?
这是我迄今为止所得到的,供参考。不幸的是,它并不多:
public override async Task GrantResourceOwnerCredentials( OAuthGrantResourceOwnerCredentialsContext context)
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" }); // TODO: Revisit.
/* The authentication portion goes here.
/* Check Active directory first. If that does not succeed, attempt basic authentication.
*/
// Using Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext().AcquireToken can't work, as I need to generate my token based on the AD credentials.
/* If AD fails, fall back to basic auth if it has been provided.
*/
// If auth fails, set context error.
if (false) // TODO: Revisit.
{
context.SetError("invalid_grant", "Authentication failed.");
}
// add user and app guid claims
var identity = new ClaimsIdentity(context.Options.AuthenticationType);
identity.AddClaim(new Claim(ApcClaimTypes.User, userGuid)); // TODO: Revisit.
identity.AddClaim(new Claim(ApcClaimTypes.Application, appGuid)); // TODO: Revisit.
// build claims from apc
var apcClaims = new List<Claim>();
// get privileges
apcClaims.AddRange(_appService.GetPrivileges(uid, aid)
.Select(p => new Claim(ApcClaimTypes.Privilege, p.PrivilegeCode)));
// get roles
apcClaims.AddRange(_appService.GetRoles(uid, aid)
.Select(r => new Claim(ClaimTypes.Role, r.RoleCode)));
identity.AddClaims(apcClaims);
context.Validated(identity);
}
答案 0 :(得分:0)
您可以执行以下操作
using System.Security;
using System.DirectoryServices.AccountManagement;
public struct Credentials
{
public string Username;
public string Password;
}
public class Domain_Authentication
{
public Credentials Credentials;
public string Domain;
public Domain_Authentication(string Username, string Password, string SDomain)
{
Credentials.Username = Username;
Credentials.Password = Password;
Domain = SDomain;
}
public bool IsValid()
{
using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, Domain))
{
// validate the credentials
return pc.ValidateCredentials(Credentials.Username, Credentials.Password);
}
}
}
或者您可以通过简单的测试来查看用户是否也在AD中
string fullName = null;
using (PrincipalContext context = new PrincipalContext(ContextType.Domain))
{
using (UserPrincipal user = UserPrincipal.FindByIdentity(context,"your domain user name"))
{
if (user != null)
{
fullName = user.DisplayName;
}
}
}