Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在使用WCF服务的WPF应用程序中集成LDAP

如何在使用WCF服务的WPF应用程序中集成LDAP
EN

Stack Overflow用户
提问于 2017-12-09 16:03:26
回答 1查看 1.7K关注 0票数 8

首先,我将描述我的应用程序在没有LDAP的情况下是如何工作的。我的WPF应用程序使用WCF服务(身份验证、窗口、UserName取决于用户的选择)。此服务允许与数据库进行通信。

我向用户显示一个“登录屏幕”,以便让他设置她的“用户名”和“密码”,然后应用程序连接到服务,并使用检查数据库中是否存在UserName和密码的函数。(见下文img )

现在,我还需要集成LDAP,以便根据现有系统对用户帐户进行身份验证,而不必创建另一个登录帐户。

我对LDAP有点无知,对许多事情感到困惑。请原谅可能使用了错误的术语。

我在谷歌上搜索过,但我仍然没有很多问题的答案。

1-存在于我的数据库表"User“中的用户和我应该在LDAP中创建的配置文件之间的关系是什么?

2-我应该做什么检查才能允许来自LDAP的用户访问我的应用程序并使用我的服务的所有功能?

3-我是否应该像我的应用程序(“UserName”和"UserName")中的其他身份验证类型一样,使用"LDAP“服务类型?

4-如果我想更新上面图片中描述的应用程序体系结构,我应该在哪里添加LDAP?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-07 01:20:57

首先我要逐一回答你的问题,

  1. LDAP上的用户在DB上是相同的,您可以在用户表中保存LDAP的用户名及其域,但是LDAP上的配置文件可能随配置文件表的不同而不同,但它可以从LDAP地址中获取。
  2. 在LDAP上检查用户名和密码就足够了,只需要在一个表(例如ExternalPath)中保存LDAP地址,并在用户和ExternalPath表之间建立一个关系。LDAP地址包含一些规范。
  3. 是的,您必须有一个单独的机制来识别LDAP用户,我将进一步解释这个机制。
  4. 如果一切都是原子的和设计正确的,这并不难,在进一步的步骤中,您可能会看到它是容易的。

因此,让我讲述我在LDAP方面的经验,并在LDAP和DB以及我们的架构上对用户进行身份验证。

我实现了一个名为Auth.svc的WCF服务,该服务包含一个名为AuthenticateAndAuthorizeUser的方法--这对于来自LDAP或任何地方的用户来说都是透明的。

我希望通过以下步骤获得通过LDAP和DB对用户进行身份验证的线索和体系结构:

1-首先,我有一个名为Users的表,它保存用户信息,还有一个名为ExternalPath作为外键的字段,如果为null,则在DB中指定UserName,否则它来自UserDirectory

2-在第二步中,您必须保存LDAP地址(在我的例子中,LDAP地址在ExternalPath表中),所有LDAP地址通常都在端口389上。

3-实现对用户身份验证的,如果找不到(带有用户名和密码),那么检查它的ExternalPath来验证LDAP地址。

4-数据库模式应该类似于下面的屏幕截图。

如您所见,ExternalPath字段指定用户是否来自LDAP。

5-在表示层中定义LDAP服务器,如下面的屏幕截图所示

6-在系统中添加新用户时,您可以为用户定义LDAP --在我的示例中,我在添加用户表单中列出了LDAP标题(如果管理员选择LDAP地址,则不需要获取密码并将其保存在DB中),正如我刚才提到的,只需要保存LDAP用户名而不是密码。

7-,但最后一件事是在LDAP和DB上验证用户。

因此,身份验证方法类似于:

代码语言:javascript
运行
AI代码解释
复制
User userLogin = User.Login<User>(username, password, ConnectionString, LogFile);
if (userLogin != null)
    return InitiateToken(userLogin, sourceApp, sourceAddress, userIpAddress);
else//Check it's LDAP path
{
    User user = new User(ConnectionString, LogFile).GetUser(username);
    if (user != null && user.ExternalPath != null)
    {
        LDAPSpecification spec = new LDAPSpecification
        {
            UserName = username,
            Password = password,
            Path = user.ExternalPath.Path,
            Domain = user.ExternalPath.Domain
        };
        bool isAthenticatedOnLDAP = LDAPAuthenticateUser(spec);

    }
}

如果通过输入userLogin和密码在DB中不存在UserName,那么我们应该通过相关的LDAP地址对其进行身份验证。

else块中,从User表中查找User并获得它的ExternalPath,如果这个字段不是null,就意味着用户在LDAP上。

8- LDAPAuthenticateUser方法是:

代码语言:javascript
运行
AI代码解释
复制
public bool LDAPAuthenticateUser(LDAPSpecification spec)
{
    string pathDomain = string.Format("LDAP://{0}", spec.Path);
    if (!string.IsNullOrEmpty(spec.Domain))
        pathDomain += string.Format("/{0}", spec.Domain);
    DirectoryEntry entry = new DirectoryEntry(pathDomain, spec.UserName, spec.Password, AuthenticationTypes.Secure);
    try
    {
        //Bind to the native AdsObject to force authentication.
        object obj = entry.NativeObject;
        DirectorySearcher search = new DirectorySearcher(entry);

        search.Filter = "(SAMAccountName=" + spec.UserName + ")";
        search.PropertiesToLoad.Add("cn");
        SearchResult result = search.FindOne();
        if (null == result)
        {
            return false;
        }
    }
    catch (Exception ex)
    {
        Logging.Log(LoggingMode.Error, "Error authenticating user on LDAP , PATH:{0} , UserName:{1}, EXP:{2}", pathDomain, spec.UserName, ex.ToString());
        return false;
    }
    return true;
}

如果在LDAPAuthenticateUser中引发的异常意味着用户在用户目录中不存在。

身份验证代码接受Active中的域、用户名、密码和树的路径。

上面的代码使用LDAP目录提供程序,身份验证方法调用LDAPAuthenticateUser并传入从用户收集的凭据。然后,使用目录树的路径、用户名和密码创建一个DirectoryEntry对象。DirectoryEntry对象试图通过获取AdsObject属性强制NativeObject绑定。如果成功,用户的CN属性是通过创建DirectorySearcher对象和过滤SAMAccountName获得的。在对用户进行身份验证和异常未发生之后,方法返回true意味着用户在给定LDAP地址上查找。

要查看有关轻量级目录访问协议的更多信息并对其进行身份验证,这个链接可能是有用的,它可以提供更多关于规范的信息。

希望会帮助你。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47734516

复制
相关文章
React:Redux怎么处理异步?
redux-thunk 中间件允许你 dispatch 一个函数(即:thunk),异步逻辑就放在这个函数中处理;
WEBJ2EE
2019/07/19
2.7K0
React:Redux怎么处理异步?
React---Redux异步action
(2).何时需要异步action:想要对状态进行操作,但是具体的数据靠异步任务返回。
半指温柔乐
2021/05/06
8600
Redux 异步数据流初探
用React写的项目中各组件的状态依赖关系非常复杂,为了便于管理组件的状态,使用 Redux。
一个会写诗的程序员
2018/12/13
6340
Redux 异步数据流初探
React-Redux 源码解析系列 -- React-Redux的作用
前面的章节讲完了redux的部分,又已经有了react,那为什么还需要有React-Redux呢?这个React-Redux 又帮助我们做了什么呢?
IMWeb前端团队
2019/12/03
7950
React-Redux 源码解析系列 -- React-Redux的作用
React-Redux 源码解析系列 -- React-Redux的作用
摘要总结:本文介绍了React-Redux的代码架构和设计理念,通过代码示例和示意图解释了React-Redux的代码结构和流程。同时,文章还探讨了React-Redux的优缺点,包括连接react和redux的方式、高阶组件的使用、纯组件的使用等。通过本文的讲解,可以更好地理解React-Redux的工作原理和架构设计,对于学习和使用React-Redux具有很高的参考价值。
IMWeb前端团队
2017/12/29
1K0
React-Redux 源码解析系列 -- React-Redux的作用
React:redux-form 应用示例
redux-form 提供了一堆 selector,便于我们从state中获取 form 表单的各种状态数据...
WEBJ2EE
2019/07/19
7180
React:redux-form 应用示例
Redux异步解决方案 1. Redux-Thunk中间件
简单介绍一下thunk,这是一个中间件,是解决redux异步问题产生的。我们都知道,在使用redux的时候,通过dispatch一个action 发生到reducer 然后传递给store修改状态 一系列都是同步的,那如果说我dispatch一个action 这个action帮我请求一下接口数据,你发现接口请求是异步的,没有办法等接口数据返回再传递给reducer 这个时候中间件就产生啦。 redux比较常用的中间件有 redux-saga、redux-thunk、redux-promise等 都是为了解决dispatch action异步处理问题
憧憬博客
2020/07/21
1.3K0
Redux 异步解决方案2. Redux-Saga中间件
因为Generator。结合yield  yield操作符会获取右边表达示的值返回 可以用于异步变同步操作 中间件的特性: 以前的 action -> reducers -> store 现在的 action -> middleware -> reducers -> store
憧憬博客
2020/07/21
1.1K0
Redux异步解决方案之Redux-Thunk原理及源码解析
前段时间,我们写了一篇Redux源码分析的文章,也分析了跟React连接的库React-Redux的源码实现。但是在Redux的生态中还有一个很重要的部分没有涉及到,那就是Redux的异步解决方案。本文会讲解Redux官方实现的异步解决方案----Redux-Thunk,我们还是会从基本的用法入手,再到原理解析,然后自己手写一个Redux-Thunk来替换它,也就是源码解析。
蒋鹏飞
2020/10/15
3.6K0
前端实现异步的几种方式_redux是什么
实际上,这个术语出自康奈尔大学的一篇论文:http://www.cs.cornell.edu/andru/cs711/2002fa/reading/sagas.pdf
全栈程序员站长
2022/10/02
1.8K0
前端实现异步的几种方式_redux是什么
异步发送邮件完整示例
本章使用task异步进程进行邮件发送,来阐述一下以上章节提到的各个知识点。 邮件类 下载swiftmailer composer require "swiftmailer/swiftmailer:^6.0" Mailer.php 与 vender目录 同级 require_once __DIR__ . '/vendor/autoload.php'; class Mailer { public $transport; public $mailer; /** * 发送邮件类
码农编程进阶笔记
2021/07/20
6710
异步发送邮件完整示例
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/111876.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/11
6200
redux-thunk 中间件的示例
Redux处理异步任务——异步数据流中间件:redux-thunk & action是一个函数,函数内部处理异步任务
用户9914333
2022/07/22
5720
在 redux 应用中使用 GraphQL
在 Redux 应用中获取和管理数据需要做许多工作。正如 Sashko Stubailo 指出的:
疯狂的技术宅
2019/03/28
2K0
在 redux 应用中使用 GraphQL
【Redux】:Redux 指北
Redux 是JavaScript 应用的状态管理容器,提供集中式、可预测的状态管理。
WEBJ2EE
2021/06/15
1.6K0
深入学习 Redux 之中间件与异步操作
上一节,学习了 Redux 的基本用法:用户发出 Action,Reducer 函数算出新的 State,View 重新渲染。
Leophen
2021/07/23
1.1K0
Redux 入门教程(二):中间件与异步操作
上一篇文章,我介绍了 Redux 的基本做法:用户发出 Action,Reducer 函数算出新的 State,View 重新渲染。 但是,一个关键问题没有解决:异步操作怎么办?Action 发出以后
ruanyf
2018/04/12
1.6K0
Redux 入门教程(二):中间件与异步操作
点击加载更多

相似问题

在Firefox上不起作用

10

在firefox上不起作用

11

print()在Firefox上不起作用

14

tinymce在firefox上不起作用

20

空格在Firefox上不起作用

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档