C# 带有自定义身份验证的.NET 4.5 WCF rest
首先,我是WCF的新手。 我使用WCF创建了一个REST Web服务。它只有一个操作可以检索json格式的产品列表。这是使用jquery从web调用的。 它工作得很好 现在,我需要的是向Web服务添加自定义身份验证。是否可以将其添加到webHttpBinding? 我添加了验证: 公共类ServiceAuthenticator:UserNamePasswordValidator { public override void Validatestring用户名、字符串密码 { 如果null==用户名| | null==密码 { 抛出新异常; } 如果userName!=testuser { 抛出新的SecurityTokenExceptionUnknown用户名或密码; } } } 我试图更改web.config以使其正常工作,但我做不到 这是我的web.config,在没有自定义身份验证的情况下工作: 以下是调用ws的jquery: 当我执行此操作时,它工作正常,但从未到达自定义验证器。我的web.config中是否缺少任何内容?如何将自定义身份验证应用于此类Web服务 我正在使用: .NET Framework 4.5 带VS2012的IIS Express 提前谢谢 编辑 身份验证由IIS执行,因此未触发自定义验证。 有一些变通办法: 自助服务, ISS托管使用ServiceAuthorizationManager执行自定义身份验证它应该用于授权,而不是身份验证,但这是我找到的唯一方法。这里有更多信息: 如果有人有其他解决方法…你可以自由发表评论!C# 带有自定义身份验证的.NET 4.5 WCF rest,c#,asp.net,web-services,wcf,webhttpbinding,C#,Asp.net,Web Services,Wcf,Webhttpbinding,首先,我是WCF的新手。 我使用WCF创建了一个REST Web服务。它只有一个操作可以检索json格式的产品列表。这是使用jquery从web调用的。 它工作得很好 现在,我需要的是向Web服务添加自定义身份验证。是否可以将其添加到webHttpBinding? 我添加了验证: 公共类ServiceAuthenticator:UserNamePasswordValidator { public override void Validatestring用户名、字符串密码 { 如果null==用户
我希望这能有所帮助。我知道我参加聚会迟到了,但我必须用我自己的一项服务来解决这个问题,其中IIS盗用了身份验证,但不清楚发生了什么,也不知道如何解决,所以这里是一个逐步解决的问题: 首先创建一个执行身份验证的类: 您的类必须从System.IdentityModel.Selectors System.IdentityModel命名空间中的UserNamePasswordValidator派生:
using System.IdentityModel.Selectors;
namespace MyProject
{
public class CustomUserNameValidator : UserNamePasswordValidator
{
public override void Validate(string userName, string password)
{
if (username != "Bob" || password != "Letmein")
through new SecurityTokenException("If you're name's not Bob, you're not coming in!")
}
}
}
接下来,您需要为您的开发端点提供SSL证书:
有许多教程可用于生成您自己的自签名证书。我用过,但有很多,你可能会发现其他更简单的方法。由于浏览器对自签名证书的限制,我使用直接自签名证书的成功率有限。为了避免这种情况,我使用相同的过程创建了根证书颁发机构,然后使用我的RCA创建了一个签名证书。这似乎满足了浏览器的限制并消除了任何警告。[严格地说,这很可能超出了要求,但警告让我很烦恼。]
创建SSL证书后,请使用certificates.msc将其注册到本地计算机\个人\证书的证书中
将您的IIS端点与端口443或您希望拥有刚刚创建的证书的任何端口绑定
接下来,您需要定义服务行为:
您的服务行为必须包含对凭据验证器和SSL证书的引用
<behavior name="MyCustomCredentialBehavior">
<serviceCredentials>
<userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="MyProject.MyCustomCredentialValidator, MyAssembly" />
<serviceCertificate findValue="CN=*.dev.myco.com"
x509FindType="FindBySubjectDistinguishedName"
storeLocation="LocalMachine" />
</serviceCredentials>
<serviceMetadata httpGetEnabled="true" />
</behavior>
您可以使用可分辨名称或指纹引用您的证书。在我这里的示例中,我使用了创建证书时选择的可分辨名称。如果使用指纹,复制/粘贴指纹时要小心,因为序列开头有一个字节标记字符,它会搞乱你的引用,因此你的应用程序找不到它。手动复制序列比受挫更容易——或者通过其他一些纯文本编辑器(如记事本)复制,这样可以去除未打印的字符
最后,您需要您的服务配置来引用您的服务行为:
如果我没记错的话,这应该是您所需要的一切。您必须使用HTTPS才能调用您的验证程序方法。Rick,我该怎么做?看看这是否有帮助:请看一下:
<behavior name="MyCustomCredentialBehavior">
<serviceCredentials>
<userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="MyProject.MyCustomCredentialValidator, MyAssembly" />
<serviceCertificate findValue="CN=*.dev.myco.com"
x509FindType="FindBySubjectDistinguishedName"
storeLocation="LocalMachine" />
</serviceCredentials>
<serviceMetadata httpGetEnabled="true" />
</behavior>
<service name="MySecureService"
behaviorConfiguration="MyCustomCredentialBehavior">
<host>
<baseAddresses>
<add baseAddress="https://myservice.com/mysecureservice/" />
</baseAddresses>
</host>
<endpoint name="MySecureServiceEndpoint"
binding="webHttpBinding"
contract="IMySecureService" />
</service>