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

目录
  • 来个ABC:
    • 新建一个ASP.NET Core项目
    • 建立一个LDAP操作的工具类
    • 在applicationSettings.json中添加基本的域配置
    • Startup.cs中修改
    • AccountController中添加登录和注销的Action

在选择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域登录的资料请关注我们其它相关文章!

(0)

相关推荐

  • ASP.NET MVC Webuploader实现上传功能

    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 1.简介:WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件.在现代的浏览器里面能充分发挥HTML5的优势,同时又不摒弃主流IE浏览器,沿用原来的FLASH运行时,兼容IE6+,iOS 6+, android 4+.两套运行时,同样的调用方式,可供用户任意选用. 2.引入资源:使用Web Uploader文件上传需要引入三种资源:JS

  • ASP.Net Core中的内存和GC机制

    托管代码 在 .NET 中, CLR(Common Language Runtime) 负责提取托管代码并编译成机器语言,然后执行它.在此过程中,CLR 提供自动内存管理.安全边界.类型安全等服务,保证了代码安全. 托管代码指在其执行过程中由 CLR(Common Language Runtime) 管理的代码,托管代码是可在 .NET 上运行得一种高级语言(C#.F#等),编写的托管代码被编译后会被生成 中间语言(IL). CLR 有 .NET Core/.NET5+.Mono..NET Fr

  • asp.net core 获取 MacAddress 地址方法示例

    本文告诉大家如何在 dotnet core 获取 Mac 地址 因为在 dotnetcore 是没有直接和硬件相关的,所以无法通过 WMI 的方法获取当前设备的 Mac 地址 但是在 dotnet core 可以使用下面的代码拿到本机所有的网卡地址,包括物理网卡和虚拟网卡 IPGlobalProperties computerProperties = IPGlobalProperties.GetIPGlobalProperties(); NetworkInterface[] nics = Net

  • ASP.NET Core在WebApi项目中使用Cookie

    目录 一.Cookie的作用 二.在ASP.NET Core中使用Cookie 1.在控制器中直接使用Cookie 1.1.设置Cookie 1.2.获取Cookie 1.3.删除Cookie信息 2.封装Cookie 一.Cookie的作用 Cookie通常用来存储有关用户信息的一条数据,可以用来标识登录用户,Cookie存储在客户端的浏览器上.在大多数浏览器中,每个Cookie都存储为一个小文件.Cookie表示为键/值对的形式,可以利用键来读取.写入或删除Cookie. 在ASP.NET

  • 基于 .NET 6 的ASP.NET Core启动地址配置方法及优先级顺序

    目录 前言: 一.设置方法 ​1.applicationUrl属性​ ​2.环境变量​ ​3.命令行参数​ ​4.UseUrls方法​ .NET5版本 .NET6版本 ​5.UseKestrel方法​ ​6.WebApplication.Urls.Add方法​ ​7.appsettings.json文件​ 二.优先级 三.结论 前言: 上次,我们讨论了如何通过配置或代码方式修改启动地址:<​ ​ASP.NET Core启动地址配置方法及优先级顺序​​>.不过是基于 .NET 5 版本的. 由于

  • ASP.Net Core中的日志与分布式链路追踪

    目录 .NET Core 中的日志 控制台输出 非侵入式日志 Microsoft.Extensions.Logging ILoggerFactory ILoggerProvider ILogger Logging Providers 怎么使用 日志等级 Trace.Debug 链路跟踪 OpenTracing 上下文和跟踪功能 跟踪单个功能 将多个跨度合并到一条轨迹中 传播过程中的上下文 分布式链路跟踪 在不同进程中跟踪 在 ASP.NET Core 中跟踪 OpenTracing API 和

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

    目录 来个ABC: 新建一个ASP.NET Core项目 建立一个LDAP操作的工具类 在applicationSettings.json中添加基本的域配置 Startup.cs中修改 AccountController中添加登录和注销的Action 在选择AD登录时,其实可以直接选择 Windows 授权,不过因为有些网站需要的是LDAP获取信息进行授权,而非直接依赖Web Server自带的Windows 授权功能. 当然如果使用的是Azure AD/企业账号登录时,直接在ASP.NET C

  • JAVA使用Ldap操作AD域的方法示例

    项目上遇到的需要在集成 操作域用户的信息的功能,第一次接触ad域,因为不了解而且网上其他介绍不明确,比较费时,这里记录下. 说明: (1). 特别注意:Java操作查询域用户信息获取到的数据和域管理员在电脑上操作查询的数据可能会存在差异(同一个意思的表示字段,两者可能不同). (2). 连接ad域有两个地址: ldap://XXXXX.com:389 和 ldap://XXXXX.com:636(SSL). (3). 端口389用于一般的连接,例如登录,查询等非密码操作,端口636安全性较高,用

  • ASP.NET Core 实现基本认证的示例代码

    HTTP基本认证 在HTTP中,HTTP基本认证(Basic Authentication)是一种允许网页浏览器或其他客户端程序以(用户名:口令) 请求资源的身份验证方式,不要求cookie,session identifier.login page等标记或载体. - 所有浏览器据支持HTTP基本认证方式 - 基本身证原理不保证传输凭证的安全性,仅被based64编码,并没有encrypted或者hashed,一般部署在客户端和服务端互信的网络,在公网中应用BA认证通常与https结合 http

  • AD域中成员服务器SQL 2008 Server安装配置图文教程

    测试环境: dc01 DC服务器cndb02 域中成员服务器用于安装sql server 第一步:为sql服务和sql管理员增加用户 服务启动帐户sqlsvc 密码:liy6$Z92SQL管理员用户sqladmin 密码:K3$f0z6  密码可自行设定,这里为了符合AD域的密码策略. 第二步:以本地管理员身份登录cndb02进行程序安装 插入安装光盘后,自动安装sql所需的系统组件 按要求重启服务器登录后,双击安装光盘开始安装 打开系统配置检查器打开全新SQL Server独立安装输入序列号接

  • ASP.NET学习CORE中使用Cookie身份认证方法

    大家在使用ASP.NET的时候一定都用过FormsAuthentication做登录用户的身份认证,FormsAuthentication的核心就是Cookie,ASP.NET会将用户名存储在Cookie中. 现在到了ASP.NET CORE的时代,但是ASP.NET CORE中没有FormsAuthentication这个东西,那么怎么做身份认证呢?答案是ASP.NET CORE已经为我们内置了Cookie身份认证的功能,而且使用起来非常方便,注意本文是基于ASP.NET CORE 2.0版本

  • 如何在ASP.NET Core中使用Session的示例代码

    ASP.NET Core 是一个跨平台,开源的,轻量级,高性能 并且 高度模块化的web框架,Session 可以实现用户信息存储从而可以在同一个客户端的多次请求之间实现用户追踪,在 ASP.Net Core 中可以使用 Microsoft.AspNetCore.Session 中间件来启用 Session 机制. 中间件的价值在于可以在 request -> response 的过程中做一些定制化的操作,比如说:监视数据,切换路由,修改流转过程中的消息体,通常来说:中间件是以链式的方式灌入到

  • 批处理命令向win server AD域中批量添加用户实现(2种)

    目录 第一种方式:命令行传参添加 第二种方式:读取文件添加用户 因为要用个批处理命令在Windows Server里面批量添加域用户,所以需要使用批处理命令. 我这篇是纯新手教程,在百度上搜了一些批处理命令感觉属于进阶教程,研究了两天才完成我要完成的目标. 下面从头说一下: 批处理bat文档建立. 直接新建一个TXT文档然后把后缀名改成.bat就可以了,就是一个bat文档,双击可以运行.注意:bat文件在哪,他的运行路径就在哪.添加成功的用户 第一种方式:命令行传参添加 dsadd user "

  • Window server 2012 R2 AD域的组策略设置步骤

    1.AD域的组策略添加有助于管理AD域中的用户使用的client端的环境. 2.组策略依附于AD域的OU构成 3.使用“gpmc.msc”在运行里面打开,或者是在“开始—管理工具”里面打开 4.在打开的组策略管理界面里面,林kaka下的DefaultDomain Policy为全局策略,而只对计算机做了配置. 一.简单组策略的建立实现: 来做一个实例说明组策略的简单实现: 要求:更改行政部门的用户 popo 在登录后的浏览器主页锁定为:www.baidu.com 则实现步骤如下所示: 1.首先在

  • Linux加入windows ad域步骤详解(winbindsamba方案)

    linux加入域中,一般都会想到加入LDAP中,这样管理起来方便,不过在linux下LDAP配置起来可不是很容易的,在企业办公环境中一般windows AD域占据霸主地位,配置方便嘛,针对生产环境的linux集群机器才会选择LDAP,不过有时候在办公环境中也混杂了linux机器,为了规范管理,也是需要把linux机器加入window是 AD中的. linux加入windows AD中方便操作的有两种方案(分为centos/ubuntu两种情况).都说了是方便操作,那必然是懒人的首选方法了. 1

  • SQL Server成功与服务器建立连接但是在登录过程中发生错误的快速解决方案

    最近在VS2013上连接远程数据库时,突然连接不上,在跑MSTest下跑的时候,QTAgent32 crash.换成IIS下运行的时候,IIS crash.之前的连接是没问题的,后网上找了资料,根据牛人所说的方案解决了. 1. Exception message 已成功与服务器建立连接,但是在登录过程中发生错误. (provider: SSL Provider, error: 0 - 接收到的消息异常,或格式不正确.) ---> System.ComponentModel.Win32Except

随机推荐