Аутентификация Active Directory по имени участника-пользователя в ASP.NET Core 3.0 - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь настроить аутентификацию и авторизацию в моем веб-приложении ASP.NET Core 3.0. Пользователи должны иметь возможность проходить аутентификацию, используя свое имя пользователя и пароль. Затем мне нужно восстановить их членство в группах, чтобы определить их роли.

Я нашел несколько статей в различных источниках, предлагающих использовать пакет NuGet для Microsoft.Windows.Compatibility. Однако мне не хватает того, как «склеить» все это вместе.

Моя основная точка отсчета - это такой вопрос: ASP.NET Core 2.0 LDAP-аутентификация Active Directory в Active Directory

Моими тремя основными вопросами являются:

  • Где находится код аутентификации в структуре кода? Отдельное пространство имен, класс и т. Д.
  • Как настроить это в моем методе ConfigureServices?
  • Как все это вписывается в структуру аутентификации / авторизации ASP?

Я ожидал увидеть какой-нибудь способ расширения метода .AddAuthentication () для охвата аутентификации, но я не могу понять, как это сделать.

Может ли кто-нибудь указать, что мне не хватает?

Спасибо

Ответы [ 2 ]

0 голосов
/ 22 октября 2019

Дао вариант работает. Я также нашел другой вариант, здесь https://www.brechtbaekelandt.net/blog/post/authenticating-against-active-directory-with-aspnet-core-2-and-managing-users с кодом https://github.com/brechtb86/dotnet/tree/master/brechtbaekelandt.ldap. Это, однако, было для Asp.Net Core 2.0.

Я обновил его для работы на Asp.Net Core 3.0,и опубликовал мой код на GitHub https://github.com/CraigTolley/AspNetCore-LdapAuth. В настоящее время он также использует библиотеку Novell. Я не обещаю, что это идеально, но, надеюсь, поможет кому-то еще.

В примере кода показана действующая аутентификация LDAP, которая затем извлекает членство в группах для аутентифицированного пользователя для создания набора ролей и утверждений, которые можно использовать для аутентификации.

0 голосов
/ 22 октября 2019

Для AD Authenticaiton вы можете попробовать Novell.Directory.Ldap.NETStandard .

Для использования аутентификации AD с Asp.Net Core вы можете комбинировать CookieAuthentication и Novell.Directory.Ldap.NETStandard.

. Вы можете выполнить следующие шаги:

  1. установить пакетNovell.Directory.Ldap.NETStandard с Version="3.0.0-beta5"
  2. IAuthenticationService и LdapAuthenticationService

    public class LdapAuthenticationService : IAuthenticationService
    {
        public bool ValidateUser(string domainName, string username, string password)
        {
            string userDn = $"{username}@{domainName}";
            try
            {
                using (var connection = new LdapConnection { SecureSocketLayer = false })
                {
                    connection.Connect(domainName, LdapConnection.DefaultPort);
                    connection.Bind(userDn, password);
    
                    if (connection.Bound)
                        return true;
                }
            }
            catch (LdapException ex)
            {
                // Log exception
            }
            return false;
        }        
    }
    public interface IAuthenticationService
    {
        bool ValidateUser(string domainName, string username, string password);
    }
    
  3. Настройка в Startup.cs

    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
    
        public IConfiguration Configuration { get; }
    
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();
            services.AddScoped<IAuthenticationService, LdapAuthenticationService>();
            services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
                    .AddCookie();
        }
    
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }
            app.UseHttpsRedirection();
            app.UseStaticFiles();
    
            app.UseRouting();
            app.UseAuthentication();
            app.UseAuthorization();
    
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });
        }
    }
    
  4. AccountController

    public class AccountController : Controller
    {
        private readonly IAuthenticationService _authenticationService;
    
        public AccountController(IAuthenticationService authenticationService)
        {
            _authenticationService = authenticationService;
        }
        public IActionResult Login()
        {
            return View();
        }
        [HttpPost]
        public async Task<IActionResult> Login(LoginModel model)
        {
            var result = _authenticationService.ValidateUser("xx.com",model.UserName, model.Password);
            if (result)
            {
                var claims = new List<Claim>
                {
                    new Claim(ClaimTypes.Name, model.UserName),
                    new Claim(ClaimTypes.Role, "Administrator"),
                };
    
                var claimsIdentity = new ClaimsIdentity(
                    claims, CookieAuthenticationDefaults.AuthenticationScheme);
    
                var authProperties = new AuthenticationProperties
                {
                    //AllowRefresh = <bool>,
                    // Refreshing the authentication session should be allowed.
    
                    //ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(10),
                    // The time at which the authentication ticket expires. A 
                    // value set here overrides the ExpireTimeSpan option of 
                    // CookieAuthenticationOptions set with AddCookie.
    
                    //IsPersistent = true,
                    // Whether the authentication session is persisted across 
                    // multiple requests. When used with cookies, controls
                    // whether the cookie's lifetime is absolute (matching the
                    // lifetime of the authentication ticket) or session-based.
    
                    //IssuedUtc = <DateTimeOffset>,
                    // The time at which the authentication ticket was issued.
    
                    //RedirectUri = <string>
                    // The full path or absolute URI to be used as an http 
                    // redirect response value.
                };
                await HttpContext.SignInAsync(
                        CookieAuthenticationDefaults.AuthenticationScheme,
                        new ClaimsPrincipal(claimsIdentity),
                        authProperties);
            }
            return Ok();
        }
        public IActionResult Index()
        {
            var user = HttpContext.User.Identity.Name;
            return View();
        }
    }
    public class LoginModel
    {
        public string UserName { get; set; }
        public string Password { get; set; }
    }
    
...