我有一个应用程序,我希望在MVC应用程序中使用来自Identity的个人身份验证的活动目录。 我的想法是,我希望每个用户都可以使用带有AD凭据的表单登录。 并使用Identity管理角色和权限。 我正在尝试使用Owin,现在我可以通过AD进行身份验证。但我无法为用户分配角色或声明,因为我的数据库中没有它们。 如何将身份验证与AD和角色以及个人身份验证声明相结合? 我用这个tuto进行AD身份验证。 http://tech.trailmax.info/2016/03/using-owin-and-active-directory-to-authenticate-users-in-asp-net-mvc-5-application/
答案 0 :(得分:2)
明白这篇文章是旧的;但是,想分享我为了让它发挥作用所做的一切。 基本思想是通过AD进行身份验证。然后在Identity中复制凭据并将现有Identity角色应用于新登录。 但是要明白,如果系统需要更改AD密码,这将导致问题。 AD的密码不会使用此代码更新Identity。
要考虑的其他事项是使用AD的组和角色而不是Identity。
我从一个实现OWIN和Identity 2.0的应用程序开始。然后,我按照上面引用的教程添加AD身份验证。自从我开始使用Identity和OWIN以来,所有的登录代码都已到位。
我的LoginController代码存在于AccountController中。我在验证模型之后和身份验证代码之前,将以下代码放入公共异步任务登录(LoginViewModel模型,字符串returnUrl)。请注意,我在其代码块中删除了返回。如果AD身份验证有效,我希望它继续通过身份验证。如果没有,它将在返回登录视图时列出所有“错误”。
var authenticationManager = HttpContext.GetOwinContext().Authentication;
var authService = new AdAuthenticationService(authenticationManager);
var authenticationResult = authService.SignIn(model.UserName, model.Password);
if (authenticationResult.IsSuccess)
{
ModelState.AddModelError("", "AD Authenticated: " + model.UserName);
// we are in
// check to see if user exixts in AspNetUsers. If not, add with default role.
var inAsp = UserManager.Users.Any(x => x.UserName == model.UserName);
if (!inAsp)
{
ModelState.AddModelError("", "Did not find User: " + model.UserName);
var newUser = new ApplicationUser
{
UserName = model.UserName,
Email = model.UserName + "@a_company.com"
};
ModelState.AddModelError("", "Set new user " + model.UserName);
// Add the AD user as an Identity user so we can relate a role to AD Login.
var chkUser = UserManager.Create(newUser, model.Password);
ModelState.AddModelError("", "Created new user: " + model.UserName + " Error: " + string.Join("\n", chkUser.Errors.ToArray()));
//Add default User to Role Admin
if (chkUser.Succeeded)
{
ModelState.AddModelError("", "Created Identity user: " + newUser.UserName);
var result1 = UserManager.AddToRole(newUser.Id, "PM");
if (result1.Succeeded)
ModelState.AddModelError("","Added PM role to user: " + newUser.UserName);
}
}
}
陷阱是:
共享视图,_LoginPartial.cshtml和_Layout.cshtml已经正确编码。