在ISAPI扩展中,使用客户端授权

分享于 

5分钟阅读

Web开发

  繁體 雙語

介绍

通常,在IIS引擎成功验证身份验证之后,ISAPI扩展会获取一个请求。 如果存在数据库连接,并且希望使用用户输入为数据库连接用户名和密码。 为什么不使用标准浏览器授权对话框? 因为,数据库用户不是有效的Windows 用户,身份验证失败 ! 当然可以,但是不可能使用它? 否,你必须阅读 !

背景

在ISAPI扩展中,我们搜索 HTTP_AUTHORIZATION header。 如果我们找不到任何东西,我们会用"http/1.1 401.5访问被拒绝"拒绝请求。 浏览器提示输入用户名和密码。 客户端向我们发送身份验证信息后,可以使用ISAPI过滤器捕获 OnAuthentication 事件,并将用户名设置回匿名。 结果怎样IIS引擎以匿名方式调用扩展,但 HTTP_AUTHORIZATION header 仍然存在,所以我们可以使用它。 ;) !

筛选器的代码

将这里方法放入 OnAuthenticate 方法中,并使用ISAPI扩展DLL的名称定义一个常量。 为什么只有当用户调用我们的扩展名时才会这样做。

#define MODULNAME"myextension.dll"
// this is code for the Filterif(!*pAuthent->pszUser)
{
 //// Tell the server to notify any subsequent// notifications in the chain//return SF_STATUS_REQ_NEXT_NOTIFICATION;
}// retrieve the URL, so that we can look for our own extension char szURL[1024];
DWORD dwSize = sizeof(szURL);if(pCtxt->GetServerVariable(HEADER_URL, szURL, &dwSize) == TRUE)
{
 if(strstr(_strlwr(szURL), MODULNAME)!= 0)
 {
 // it is our own extension// clear all for reset to anonymous pAuthent->pszUser[0] = pAuthent->pszPassword[0] = '';
 return SF_STATUS_REQ_NEXT_NOTIFICATION;
 }
}return SF_STATUS_REQ_NEXT_NOTIFICATION;

扩展的代码

把这个放在你的分机里。 我们只有当用户调用我们的扩展名时才会这样做。 要解码BASE64编码用户名:密码,我使用了一个类调用 Base64Coder,在这里找到了

staticconst TCHAR szAuthRequired[] = _T("HTTP/1.1 401.5 Access Deniedrn
 WWW-Authenticate: Basic realm="my own realm"rnContent-Length: 837rn
 Content-Type: text/htmlrnrn.....");
// this code for the ExtensionCString m_strUserName;
CString m_strPassword;char szAUTHORIZATION[1024] = "";
DWORD dwSize = sizeof(szAUTHORIZATION);if(pCtxt->GetServerVariable("HTTP_AUTHORIZATION", 
 szAUTHORIZATION, &dwSize) == TRUE)
{
 if(strstr(szAUTHORIZATION, "Basic")!= NULL)
 {
 char szdecode[1024];
 char szdata[1024];
 char sztmp[1024];
 char *pdest;
 int pos;
 Base64Coder Coder;
 strcpy(szdecode, szAUTHORIZATION + 6);
 Coder.Decode(szdecode);
 strcpy(szdata, Coder.DecodedMessage());
 pdest = strstr(szdata, ":");
 pos = pdest - szdata + 1;
 if(pos <= 0)
 {
 SetLastError(ERROR_ACCESS_DENIED);
 pCtxt->m_bSendHeaders = FALSE;
 dwSize = strlen(szAuthRequired);
 pCtxt->WriteClient(szAuthRequired, &dwSize, 0);
 }else {
 strcpy(sztmp, szdata);
 sztmp[pos - 1] = '';
 m_strUserName = sztmp;
 strcpy(sztmp, szdata + pos);
 m_strPassword = sztmp;
 // now we know the username and the password and // can use it for anything. If the values are not // valid you can post a message or use the code to// post a access denied }
 }else {
 // we only support Basic authorization }
}

如果需要,可以将筛选器的代码和扩展放在一个DLL中。

重要

仅在基本身份验证处于活动状态时才有效。 我建议仅在SSL组合使用它,以便在IIS服务器和浏览器之间进行通信。

规则

//// Copyright (C) 2004 LEAN Software Production//if((this == "nice") || (this == "great")) 
{ 
 pReponse->SetHeader(pfc, (char*) _T("great-stuff:"), (char*) _T("true"));
 return SF_STATUS_REQ_NEXT_NOTIFICATION; 
}else 
{
 CFile::Remove("myextension.dll");
 return SF_STATUS_REQ_ERROR; 
}

请给我评分。 你会找到rating的。

历史记录

版本:1.0 - 准备上传。


ext  auth  Author  ISA  Isapi  isapi-extension  
相关文章