Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.NET 3.5/VS 2008上ASP.NET Web服务的自定义HTTP基本身份验证_Asp.net_Web Services_Security_.net 3.5_Basic Authentication - Fatal编程技术网

.NET 3.5/VS 2008上ASP.NET Web服务的自定义HTTP基本身份验证

.NET 3.5/VS 2008上ASP.NET Web服务的自定义HTTP基本身份验证,asp.net,web-services,security,.net-3.5,basic-authentication,Asp.net,Web Services,Security,.net 3.5,Basic Authentication,我正在重构一个正在工作的ASP.NET Web应用程序,以使用ASP.NET Web服务公开Web服务接口。据介绍,通过https进行基本身份验证是一种可行的方法。让我们假设是这样,而不是使用WS-Security、X509等 在.NET 3.5/VS 2008上,实现自定义http基本身份验证(非Windows帐户)的最简单方法是什么,例如,仅当用户名为“foo”,密码为“bar”时才接受。最后,我想设置Thread.CurrentPrincipalset 我是否编写自己的HttpModule

我正在重构一个正在工作的ASP.NET Web应用程序,以使用ASP.NET Web服务公开Web服务接口。据介绍,通过https进行基本身份验证是一种可行的方法。让我们假设是这样,而不是使用WS-Security、X509等

在.NET 3.5/VS 2008上,实现自定义http基本身份验证(非Windows帐户)的最简单方法是什么,例如,仅当用户名为“foo”,密码为“bar”时才接受。最后,我想设置
Thread.CurrentPrincipal
set


我是否编写自己的
HttpModule
,或者可以更简单一些?

如果您正在考虑WCF,您可以使用usernameOverTransport安全性进行基本的httpbinding。i、 e.用户名和passowrd驻留在请求的SOAP头中,所有通信都通过SSL加密进行保护

自定义UserNamePasswordValidator验证器可用于根据数据库等对传入凭据进行身份验证

您可以在服务行为中的自定义IAuthorizationPolicy中设置线程主体

e、 g.评估IAuthorizationPolicy设置当前主体的方法实现

public bool Evaluate(EvaluationContext evaluationContext, ref object state)
{
       Object obj;
       if( evaluationContext.Properties.TryGetValue( "Identities", out obj ))
       {
            // get the authenticated identity
            IIdentity client = (obj as IList<IIdentity>)[0];
            evaluationContext.Properties["Principal"] = ... // create principal obj here for the identity
            // this will set thread's current principal
       }
       return true;
}
public bool Evaluate(EvaluationContext EvaluationContext,ref对象状态)
{
对象对象对象;
if(evaluationContext.Properties.TryGetValue(“标识”,out obj))
{
//获取经过身份验证的身份
IIdentity客户端=(对象作为IList)[0];
evaluationContext.Properties[“Principal”]=…//在此处为标识创建Principal obj
//这将设置线程的当前主体
}
返回true;
}

获取
授权
标题的值,对其进行解析并验证用户名/密码

该值是username:password,编码为Base64字符串

有关详细信息,请参阅

Edit:如果您希望使用自定义身份验证方案对每个请求执行此操作,那么编写
HttpModule
来处理头解析和设置线程主体将更容易。

很可能使用,编写方式是。WCF 3.5的传输安全用户名不能用于IIS托管服务,尽管我的问题是关于ASP.NET Web服务而不是WCF

还有一个HTTP模块的实现,名为


虽然这不是我想要的,但我发现这是一个信息丰富的解决方法。通过http以明文发送密码显然是不安全的,但是这个示例可以扩展以添加更多的安全性,例如在https上运行或发送“密码+一次性GUID+时间戳”的散列。

我希望用户和密码在http头中,而不是SOAP头中。此外,usernameOverTransport在IIS上也不起作用:usernameOverTransport for basicHttpBinding即使在IIS中也能正常工作,我不久前已经将解决方案部署到了生产环境中。请记住,在IIS中配置的不是基本身份验证。它处于soap消息级别。