MVC5 OWIN广告和数据库

时间:2016-04-26 14:23:41

标签: asp.net owin asp.net-mvc-5

我正在创建一个MVC5应用程序。这是一个内联网应用程序。所有用户都已通过本地Active Directory域的身份验证。

我们有一个现有的数据库,目前用于Windows应用程序。

我想获取用户的域登录名,并使用它来查找已在该数据库中配置的角色和声明。

我将假设ASP.NET / MVC5 /身份验证“个人用户帐户”的基础项目将是起点。

请指出正确的方向。

由于

2 个答案:

答案 0 :(得分:1)

您不需要整个ASP.Net标识。相反,您可以使用OWIN cookie身份验证中间件。

通过Active Directory验证凭据

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);
}

Startup.cs

您还需要为所有发生的事件配置启动。

[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标识表合并到其中,反之亦然。身份功能需要这些表,您无法更改它。我会创建一个测试项目并熟悉这些表。然后弄清楚如何将它们合并到现有数据库中,反之亦然。我为我的自定义功能大量修改了这些表。但核心表和列必须存在。