- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个 SEC_WINNT_AUTH_IDENTITY 以用于调用 AcquireCredentialsHandle 以获得此身份的凭据。但是我很难创建身份验证日期。
这是用于创建结构的代码:
#define SECURITY_WIN32
#include <Windows.h>
#include <sspi.h>
int main(int argc, char* argv[]) {
SEC_WINNT_AUTH_IDENTITY AuthId;
char* login = "login";
char* domain = "mydomain.com";
char* password = "pass";
AuthId.User = login;
AuthId.UserLength = strlen(login);
AuthId.Domain = domain;
AuthId.DomainLength = strlen(domain);
AuthId.Password = password;
AuthId.PasswordLength = strlen(password);
AuthId.Flags = SEC_WINNT_AUTH_IDENTITY_ANSI;
//Here the call to AcquireCredentialHandle and the end of the program
}
问题是该结构需要 unsigned short __RPC_FAR *User
但我找不到关于此的任何信息以及我应该如何将字符串传递给它。我在网上找到的例子都是直接使用字符串。
最佳答案
在这种情况下,ODBC 的一些经验帮助了我。但是,它不适用于 Unicode 密码,我现在不需要它。但如果有人能给出提示就好了。
好吧,这是我的解决方案。我创建了辅助类:
标题:
class StringParam
{
public:
StringParam();
StringParam(const std::wstring& val);
StringParam(const std::string& val);
virtual ~StringParam();
unsigned short* GetBuffer() const;
unsigned long GetBufferLength() const;
unsigned long GetLength() const;
private:
unsigned short* buffer;
unsigned long bufferLength;
};
实现:
StringParam::StringParam():
buffer(NULL),
bufferLength(0)
{
}
StringParam::StringParam(const std::wstring& val):
StringParam()
{
size_t len = val.size(); // .length() is the same
bufferLength = sizeof(unsigned short) * (len + 1);
unsigned short* buf = new unsigned short[len + 1];
memset(buf, 0, bufferLength);
int i = 0;
for (wchar_t c: val)
buf[i++] = (unsigned short)c;
buffer = reinterpret_cast<unsigned short*>(buf);
}
StringParam::StringParam(const std::string& val):
StringParam()
{
size_t len = val.size(); // .length() is the same
bufferLength = sizeof(unsigned short) * (len + 1);
unsigned short* buf = new unsigned short[len + 1];
memset(buf, 0, bufferLength);
int i = 0;
for (char c: val)
buf[i++] = (unsigned short)c;
buffer = reinterpret_cast<unsigned short*>(buf);
}
StringParam::~StringParam()
{
if (buffer)
{
delete[] buffer;
buffer = NULL;
bufferLength = 0;
}
}
unsigned short* StringParam::GetBuffer() const
{
return buffer;
}
unsigned long StringParam::GetBufferLength() const
{
return bufferLength;
}
unsigned long StringParam::GetLength() const
{
return bufferLength / sizeof(unsigned short);
}
用法:
SECURITY_STATUS res;
// Aquire credentials
CredHandle credentials;
TimeStamp credentialsExpiryTime;
SEC_WINNT_AUTH_IDENTITY userIdentity;
StringParam prmDomain("domain.com");
StringParam prmUser("username");
StringParam prmPassword("password#1");
// wstring version will also work:
//StringParam prmDomain(L"domain.com");
//StringParam prmUser(L"username");
//StringParam prmPassword(L"password#1");
userIdentity.Domain = prmDomain.GetBuffer();
userIdentity.DomainLength = prmDomain.GetLength();
userIdentity.User = prmUser.GetBuffer();
userIdentity.UserLength = prmUser.GetLength();
userIdentity.Password = prmPassword.GetBuffer();
userIdentity.PasswordLength = prmPassword.GetLength();
userIdentity.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
res = AcquireCredentialsHandle(NULL, L"Kerberos", SECPKG_CRED_INBOUND, NULL, &userIdentity, NULL, NULL, &credentials, &credentialsExpiryTime);
对我来说效果很好。诀窍在于 wchar_t 的长度为 4 个字节。但是 SSPI 使用 UTF-16。在 ODBC 中,从 wstring 转换的 Unicode 字符有效,但这里有所不同。
关于c++ - SEC_WINNT_AUTH_IDENTITY 创建 (SSPI),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28877812/
我正在开发一个 .NET 应用程序,我试图在其中构建数据库脚本。在构建项目时,我收到错误“无法创建 SSPI 上下文。”。此错误显示在输出窗口(VS2008 屏幕内)中,并且构建过程失败。请帮忙解决这
我使用的是 Windows XP Pro SP3。我想在我的代码中使用 SSPI 函数。我编译了我的代码,没有错误。 我将安全包设置为用于协商,这是推荐的。 当我启动我的程序时,Negotiate 无
我正在尝试创建一个 SEC_WINNT_AUTH_IDENTITY 以用于调用 AcquireCredentialsHandle 以获得此身份的凭据。但是我很难创建身份验证日期。 这是用于创建结构的代
当我在本地机器上运行 WCF 服务时,它工作正常。当我将相同的文件部署到我们的测试服务器时,当我的测试客户端尝试连接到 WCF 服务时出现此错误: Security Support Provider
我正在尝试调用托管在 IIS 上并应用了 Windows 身份验证安全性的 Web 服务。 我正在将 Delphi XE 与 INDY 10 和 TIdHttp 组件结合使用。 如果我传入有效的用户名
我在工作中遇到了一个问题,即我们使用 WCF 进行 SSO 的应用程序在与其他域通信时对域信任使用选择性身份验证失败。这是在服务器 2k8R2 机器上,它们的两个域都处于完整的 2k8R2 功能级别(
我的应用程序在两天前运行良好。我能够在实时应用程序上完全正常地发送推送通知,但突然我开始收到此错误 {System.Security.Authentication.AuthenticationExce
我有以下代码: public GetUserDataResponse GetUserDataFromService(X509Certificate2 certificate) { Channe
我想在Windows域环境(使用Kerberos)中使用Microsoft的安全支持提供程序接口(SSPI)在两个实体之间(在C ++中)发送加密和签名的消息。 根据MSDN中的文档,有两个函数Mak
try { _apnsStream.AuthenticateAsClient("gateway.sandbox.push.apple.com", certificates, System.Se
我的项目出现了一些 fatal error ,错误来自 sspi.h,我必须定义一些东西,但我不知道是什么以及为什么,请有人解释。 sspi.h(60): fatal error C1189: #er
背景 Windows SSPI API是 Windows 安全服务的一个接口(interface),允许您相互验证客户端和服务器。 API 的主要用途之一是提供 Windows 集成身份验证,也称为单
我正在开发一个客户端-服务器应用程序,我希望客户端使用用户的登录凭据向服务器进行身份验证,但我不希望用户必须输入他们的用户名和密码。我当然不想负责安全处理密码。我只需要用户向我证明他们就是他们所说的那
我正在尝试访问 wcf 客户端。我知道人们现在正在从中获取信息,所以我知道它有效。我的问题是我似乎无法克服它。该服务是相互认证的服务。我在本地计算机上的个人商店中有适当的证书。即使这样,我也会遇到以下
在我们的 Windows C++ 应用程序中,我使用 InitializeSecurityContext() 客户端打开与运行 stunnel SSL 代理的服务器的 schannel 连接。我的代码
注:我设法取得了一些进展,请参阅我当前问题的编辑,谢谢。 我想在 Windows 上使用 libcurl 通过 Kerberos/GSSAPI 身份验证访问网站。我首先尝试使用 MIT Kerbero
我正在努力获取从计算机 A 到运行 SQL Server 的计算机 B 的 SQL Server 连接。 我在谷歌上进行了广泛的搜索,但我发现的所有东西都不起作用。他们也不会引导您一步步解决这个问题。
我有一个奇怪的问题:我在基于 .net2 的 c# 中编写了一个服务器和客户端,它们正在通过 .net 2 SslStream 聊天。 Cl和S之间有1个发送命令的连接,cl和s之间有1个发送文件的连
我有一个 Linux 服务器应用程序,它使用 Kerberos 进行客户端身份验证和需要在 Windows 上运行的客户端。 Kerberos 票证由 Windows Active Directory
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以
我是一名优秀的程序员,十分优秀!