我正在创建一个MVC5应用程序。这是一个内联网应用程序。所有用户都已通过本地Active Directory域的身份验证。
我们有一个现有的数据库,目前用于Windows应用程序。
我想获取用户的域登录名,并使用它来查找已在该数据库中配置的角色和声明。
我将假设ASP.NET / MVC5 /身份验证“个人用户帐户”的基础项目将是起点。
请指出正确的方向。
由于
答案 0 :(得分:1)
您不需要整个ASP.Net标识。相反,您可以使用OWIN cookie身份验证中间件。
public bool ValidateCredentials(string userName, string password)
{
using (var context = new PrincipalContext(ContextType.Domain))
{
return context.ValidateCredentials(userName, password);
}
}
经过身份验证后,您希望从旧数据库中检索授权角色,并创建声明。
private readonly HttpContextBase _context;
private const string AuthenticationType = "ApplicationCookie";
public OwinAuthenticationService(HttpContextBase context)
{
_context = context;
}
public void SignIn(User user)
{
IList<Claim> claims = new List<Claim>
{
new Claim(ClaimTypes.Sid, user.Id.ToString()),
new Claim(ClaimTypes.Name, user.UserName),
new Claim(ClaimTypes.GivenName, user.FirstName),
new Claim(ClaimTypes.Surname, user.LastName),
};
// Get authorized roles from old database
foreach (Role role in user.Roles)
{
claims.Add(new Claim(ClaimTypes.Role, role.Name));
}
ClaimsIdentity identity = new ClaimsIdentity(claims, AuthenticationType);
IOwinContext context = _context.Request.GetOwinContext();
IAuthenticationManager authenticationManager = context.Authentication;
authenticationManager.SignIn(identity);
}
public void SignOut()
{
IOwinContext context = _context.Request.GetOwinContext();
IAuthenticationManager authenticationManager = context.Authentication;
authenticationManager.SignOut(AuthenticationType);
}
您还需要为所有发生的事件配置启动。
[assembly: OwinStartup(typeof(YourApplication.Startup))]
namespace YourApplication
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "ApplicationCookie",
LoginPath = new PathString("/Account/Login")
});
}
}
}
我希望你得到起点。
答案 1 :(得分:0)
.NET OWIN Identity类要求您通过ApplicationUserManager类的CheckPasswordAsync()方法进行身份验证。这可以通过覆盖ApplicationUserManager类的CheckPasswordAsync()方法来完成。在您的覆盖中,您需要调用System.DirectoryServices.AccountManagement类的ValidateCredentials()方法以通过Active Directory进行身份验证。这将要求用户使用其Windows用户名和密码登录应用程序。虽然有几个步骤可以让它工作。
正如您所说,您从一个具有“个人用户帐户”身份验证的基础项目开始。
步骤1 - 通过将以下代码添加到ConfigureAuth()方法,更新文件App_Start \ Startup.Auth.cs中的ConfigureAuth()方法。
using System.DirectoryServices.AccountManagement;
//Add an Owin context for Active Directory principals
app.CreatePerOwinContext(() => new PrincipalContext(ContextType.Domain));
其余更新在文件App_Start \ IdentityConfig.cs中完成
步骤2 - 更新类ApplicationUserManager的构造函数。
using System.DirectoryServices.AccountManagement;
//Add a PrincipalContext parameter to the constructor
public ApplicationUserManager(IUserStore<ApplicationUser> store, PrincipalContext principal) : base(store)
{
this.principal = principal;
}
步骤3 - 在Create()方法中更新对ApplicationUserManager类的构造函数的调用。
//Add the PrincipalContext parameter
var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<PortalIdentityDbContext>()), context.Get<PrincipalContext>());
步骤4 - 覆盖ApplicationUserManager类的CheckPasswordAsync()方法。
//Override CheckPasswordAsync to login via Active Directory.
public override async Task<bool> CheckPasswordAsync(ApplicationUser user, string password)
{
return await Task.FromResult(this.principal.ValidateCredentials(user.UserName, password, ContextOptions.Negotiate));
}
至于使用现有数据库,您必须将OWIN标识表合并到其中,反之亦然。身份功能需要这些表,您无法更改它。我会创建一个测试项目并熟悉这些表。然后弄清楚如何将它们合并到现有数据库中,反之亦然。我为我的自定义功能大量修改了这些表。但核心表和列必须存在。