FBA 和 SQL 服务器: 一个爱情故事

我的同事一直致力于在 FBA 环境中的 web 部件. 除其他外, web 部件拉一些数据从 SQL server. 为此项目的宏伟计划规定 DBA 在 SQL 配置数据级安全性 (相对于在 SQL 查询或一些其他的方法中嵌入的用户 ID).

问题是 SQL 服务器不知道任何有关我们 FBA 环境,所以它不能信任我们. 我们解决了这个问题的, 为更好的词的缺乏, 手动模拟 AD 用户,以便我们可以连接到 SQL 这样 SQL 数据级安全工程.

即使 FBA 是 ASP。净功能, 我们 SharePoint 民族人教各搜索引擎,如果你正在查询的 FBA, 你一定是说你想要知道如何在 SharePoint 中配置 FBA. 我没能找到找到任何信息有关如何启用 FBA 面向 ASP.NET 应用程序与 SQL 的方式我们需要沟通.

这研究的过程中, 我们重读这篇文章: ASP。净模拟

更多的研究,把我们带到本文 codproject: http://www.codeproject.com/KB/cs/cpimpersonation1.aspx

这帮助我们写我们的代码, 其中已经低于. 它不是最优雅的东西, 但它的工作. 我希望对您有所帮助.

以下是为我们工作的代码:

受保护 无效的 btnSearchCarrier_Click(发件人对象, EventArgs e)
 {
 请尝试
 {
 ImpersonateUser iU = 新增功能 ImpersonateUser();
 // TODO: 替换凭据 iU.Impersonate("域名", "用户名", "密码");

//
 代码
//

 iU.Undo();
 }
 赶上 (Ex 异常)
 {

 }
 }

// 使用以下提及的模拟类.

公众 ImpersonateUser
 {
 [DllImport(""advapi32.dll, SetLastError = true)]
 公众 静态 extern LogonUser bool(
 字符串 lpszUsername,
 字符串 lpszDomain,
 字符串 lpszPassword,
 int dwLogonType,
 int dwLogonProvider,
 ref IntPtr phToken);

 [DllImport(""kernel32.dll, 字符集 = CharSet.Auto)]
 私人 extern 静态 CloseHandle bool(IntPtr 句柄);

 私人 静态 IntPtr tokenHandle = 新增功能 IntPtr(0);
 私人 静态 WindowsImpersonationContext impersonatedUser;

 // 如果您将此代码合并到一个 DLL, 一定要要求,它
 // 用 FullTrust 运行.
 [PermissionSetAttribute(SecurityAction.Demand, 名称 = ""FullTrust)]
 公众 无效的模拟(字符串域名, 用户名的字符串, 字符串密码)
 {
 请尝试
 {

 // 使用非托管的 LogonUser 函数来获取用户的令牌
 // 指定的用户, 域, 和密码.
 const int LOGON32_PROVIDER_DEFAULT = 0;

 // 传递此参数导致 LogonUser 创建一个主令牌.
 const int LOGON32_LOGON_INTERACTIVE = 2;
 tokenHandle = IntPtr.Zero;

 // 一步 -1 调用 LogonUser 以获取访问令牌的句柄.
 bool returnValue = LogonUser(
 用户名,
 域名,
 密码,
 LOGON32_LOGON_INTERACTIVE,
 LOGON32_PROVIDER_DEFAULT,
 ref tokenHandle); // tokenHandle - 新的安全令牌

 如果 (false = = returnValue)
 {
 int ret = Marshal.GetLastWin32Error();
 Console.WriteLine("LogonUser 调用失败,错误代码 : " +
 ret);
 抛出 新 System.ComponentModel.时如何引发 Win32Exception(ret);
 }

 // 一步 - 2
 WindowsIdentity newId = 新增功能 WindowsIdentity(tokenHandle);
 // 一步 -3
 impersonatedUser = newId.Impersonate();

 }
 赶上 (Ex 异常)
 {
 Console.WriteLine("发生异常. " + 前。消息);
 }
 }


 /// <摘要>
 /// 停止模拟
 /// </摘要>
 公众 无效的撤消()
 {
 impersonatedUser.Undo();
 // 无标记.
 如果 (tokenHandle != IntPtr.Zero)
 CloseHandle(tokenHandle);
 }
 }

</结束>

订阅我的博客.

Technorati 标签:

一个念头在“FBA 和 SQL 服务器: 一个爱情故事

  1. 大卫早
    很抱歉这张贴不相关的问题,但可以不出如何从这个博客向您发送一封电子邮件.
    你有以前的帖子,在那里你提供一个伟大的方式来筛选库以查看未加标签的数据. 你有任何想法,如何在整个文档库中查看的未加标签的文档的列表吗? 使用一个空的字段,在高级搜索中不返回任何结果.
    答复

留言

您的电子邮件地址不会被公开. 必需的地方已做标记 *