ASP.NET的Core AD域登录过程示例

 更新时间:2022年04月02日 11:35:32   作者:重典  
这篇文章主要为大家介绍了ASP.NET Core AD域登录过程示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪

在选择AD登录时,其实可以直接选择 Windows 授权,不过因为有些网站需要的是LDAP获取信息进行授权,而非直接依赖Web Server自带的Windows 授权功能。

当然如果使用的是Azure AD/企业账号登录时,直接在ASP.NET Core创建项目时选择就好了。

来个ABC:

新建一个ASP.NET Core项目

Nuget引用dependencies / 修改```project.json```

Novell.Directory.Ldap.NETStandard

Microsoft.AspNetCore.Authentication.Cookies

版本如下:

"Novell.Directory.Ldap.NETStandard": "2.3.5",

"Microsoft.AspNetCore.Authentication.Cookies": "1.1.0"

本文的AD登录使用的是第三方的

```Novell.Directory.Ldap.NETStandard``` 进行的LDAP操作(还没有看这个LDAP的库是否有安全性问题,如果有需要修改或更换)

建立一个LDAP操作的工具类

代码在下面链接中,就不单独贴了,基本上就2个方法:

Register是获取基本配置信息的

Validate是来验证用户名密码的

using System;
using Microsoft.Extensions.Configuration;
using Novell.Directory.Ldap;
namespace Demo
{
    public class LDAPUtil
    {
        public static string Host { get; private set; }
        public static string BindDN { get; private set; }
        public static string BindPassword { get; private set; }
        public static int Port { get; private set; }
        public static string BaseDC { get; private set; }
        public static string CookieName { get; private set; }
        public static void Register(IConfigurationRoot configuration)
        {
            Host = configuration.GetValue<string>("LDAPServer");
            Port = configuration?.GetValue<int>("LDAPPort") ?? 389;
            BindDN = configuration.GetValue<string>("BindDN");
            BindPassword = configuration.GetValue<string>("BindPassword");
            BaseDC = configuration.GetValue<string>("LDAPBaseDC");
            CookieName = configuration.GetValue<string>("CookieName");
        }
        public static bool Validate(string username, string password)
        {
            try
            {
                using (var conn = new LdapConnection())
                {
                    conn.Connect(Host, Port);
                    conn.Bind($"{BindDN},{BaseDC}", BindPassword);
                    var entities =
                        conn.Search(BaseDC,LdapConnection.SCOPE_SUB,
                            $"(sAMAccountName={username})",
                            new string[] { "sAMAccountName" }, false);
                    string userDn = null;
                    while (entities.hasMore())
                    {
                        var entity = entities.next();
                        var account = entity.getAttribute("sAMAccountName");
                        //If you need to Case insensitive, please modify the below code.
                        if (account != null && account.StringValue == username)
                        {
                            userDn = entity.DN;
                            break;
                        }
                    }
                    if (string.IsNullOrWhiteSpace(userDn)) return false;
                    conn.Bind(userDn, password);
                    // LdapAttribute passwordAttr = new LdapAttribute("userPassword", password);
                    // var compareResult = conn.Compare(userDn, passwordAttr);
                    conn.Disconnect();
                    return true;
                }
            }
            catch (LdapException)
            {
               
                return false;
            }
            catch (Exception)
            { 
                return false;
            }
        }

    }
}

在applicationSettings.json中添加基本的域配置

"LDAPServer": "192.168.1.1",//域服务器

"LDAPPort": 389,//端口,一般默认就是这个

"CookieName": "testcookiename",//使用Cookie登录的Cookie的Key

"BindDN": "CN=DoWebUser,CN=Users",//用来获取LDAP的信息用户的用户名

"BindPassword": "!DoWebUserPassword",//用来获取LDAP的信息的用户的密码,即DoWebUser的密码

"LDAPBaseDC": "DC=aspnet,DC=com",//域的DC

Startup.cs中修改

Startup方法中:

LDAPUtil.Register(Configuration);

ConfigureServices 方法中:

services.AddAuthorization(options =>{});

Configure方法中:

app.UseCookieAuthentication(new CookieAuthenticationOptions()
     {
       AuthenticationScheme = Configuration.GetValue<string>("CookieName"),
       LoginPath = new PathString("/Account/Login/"),
       AccessDeniedPath = new PathString("/Account/Login/"),
       AutomaticAuthenticate = true,
       AutomaticChallenge = true
});

AccountController中添加登录和注销的Action

登录的页面:

[AllowAnonymous]
public IActionResult Login()
{
    return View();
}

登录的Post页面:

[HttpPost]
[AllowAnonymous]
public async Task<IActionResult> Login(string u, string p)
{
    if (LDAPUtil.Validate(u, p))
    {
        var identity = new ClaimsIdentity(new MyIdentity(u));//这个MyIdentity只是一个祼的IIdentity的实现的类
        var principal = new ClaimsPrincipal(identity);
        await HttpContext.Authentication.SignInAsync(LDAPUtil.CookieName, principal);
        return RedirectToAction("Index", "Home");
    }
    return View();
}

注销的页面:

[Authorize]
public async Task<IActionResult> Logout()
{
   await HttpContext.Authentication.SignOutAsync(LDAPUtil.CookieName);
   return RedirectToAction("Index", "Home");
}

Demo

https://github.com/chsword/aspnet-core-ad-authentication

引用

https://github.com/dsbenghe/Novell.Directory.Ldap.NETStandard

https://www.nuget.org/packages/Microsoft.AspNetCore.Authentication.Cookies/

以上就是ASP.NET的Core AD域登录过程示例的详细内容,更多关于ASP.NET Core AD域登录的资料请关注脚本之家其它相关文章!

相关文章

  • C#与.net高级编程 C#的多态介绍

    C#与.net高级编程 C#的多态介绍

    封装、继承、多态,面向对象的三大特性,前两项理解相对容易,但要理解多态,特别是深入的了解,对于初学者而言可能就会有一定困难了
    2012-11-11
  • asp.net core使用DevExtreme20将int列转为checkbox方法示例

    asp.net core使用DevExtreme20将int列转为checkbox方法示例

    这篇文章主要为大家介绍了asp.net core使用DevExtreme20将int列转为checkbox方法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • ASP遗留的二十个积习

    ASP遗留的二十个积习

    ASP遗留的二十个积习
    2006-07-07
  • Net内存管理五大基础

    Net内存管理五大基础

    这篇文章主要给大家分享Net内存管理五大基础内容,文章讲围绕Net内存管理详细介绍文章内容,感兴趣的朋友可以参考一下,希望对你有所帮助
    2021-10-10
  • 详解如何使用Net将HTML简历导出为PDF格式

    详解如何使用Net将HTML简历导出为PDF格式

    这篇文章主要为大家介绍了详解如何使用Net将HTML简历导出为PDF格式详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • asp.net创建事务的方法

    asp.net创建事务的方法

    本篇文章主要对asp.net创建事务的方法进行实例介绍,具有很好的参考价值,需要的朋友一起来看下吧
    2016-12-12
  • ASP.NET Core使用功能开关控制路由访问操作(续)

    ASP.NET Core使用功能开关控制路由访问操作(续)

    这篇文章主要介绍了ASP.NET Core使用功能开关控制路由访问操作的(续),上一篇文章我们已经介绍过一部份该相关内容,​​在本文,我们可以判断当前路由地址是否为调试地址,让评估返回真,需要的小伙伴可以参考一下
    2022-02-02
  • 从零开始学ASP.NET-基础篇

    从零开始学ASP.NET-基础篇

    从零开始学ASP.NET-基础篇...
    2006-07-07
  • .NET  Smobiler的复杂控件的由来与创造

    .NET  Smobiler的复杂控件的由来与创造

    这篇文章主要介绍了.NET Smobiler的复杂控件的由来与创造,Smobiler的复杂控件即利用自定义控件的方式组合控件,来使控件成为一个有机整体,里面的控件可相互协作交互,并使其达到高可用
    2022-08-08
  • .NET 6 即将到来的新特性  隐式命名空间引用

    .NET 6 即将到来的新特性 隐式命名空间引用

    ASP.NET 现在我们还是需要手动加命名空间引用,在以后的版本中可能就不需要手动加命名空间的引用了,本文就来介绍.NET 6即将到来的新特性--隐式命名空间引用,,需要的朋友可以参考下面文章内容
    2021-09-09

最新评论