基本身份验证和 WCF REST 服务配置出现问题
本文关键字:配置 问题 服务 REST 身份验证 WCF | 更新日期: 2023-09-27 17:56:09
我已经试图弄清楚这个问题几天了。我知道我很接近,但不能完全弄清楚我错过了什么。
- 该服务位于 IIS 上托管的网站中
- 为站点启用基本身份验证,并禁用所有其他身份验证(包括匿名身份验证)。
- 我创建了一个自签名证书并设置了 https 绑定
- 我已经覆盖了用户名密码验证器的验证方法,但是当我附加断点时,它没有到达。所以我的问题可能与此有关。
- 当我尝试在 https://localhost/Services/JobSiteService.svc/rest/get 访问我的服务方法时,由于我收到 401 未授权错误,不断提示我输入用户名和密码。
谁能看出我做错了什么?
下面的相应代码:
网络配置
网 <system.serviceModel>
<bindings>
<webHttpBinding>
<binding name="webHttpTransportSecurity">
<security mode="Transport">
<transport clientCredentialType="Basic" />
</security>
</binding>
</webHttpBinding>
</bindings>
<services>
<service name="Validity.WebService.JobSiteService" behaviorConfiguration="SecureRestBehavior">
<endpoint address="rest" binding="webHttpBinding" behaviorConfiguration="RESTBehavior" bindingConfiguration="webHttpTransportSecurity" contract="Validity.WebService.Contracts.IJobSiteService" />
<endpoint address="meta" binding="mexHttpsBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="SecureRestBehavior">
<serviceMetadata httpGetEnabled="false" httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
<serviceCredentials>
<userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="Validity.WebService.IdentityValidator, Validity.WebService" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="RESTBehavior" >
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
<protocolMapping>
<add binding="webHttpBinding" scheme="https" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
服务合同:
[ServiceContract]
public interface IJobSiteService
{
[OperationContract]
[WebInvoke(Method="GET", ResponseFormat=WebMessageFormat.Json)]
List<JobSite> Get();
}
自定义验证器(它位于命名空间"Validity.WebService"中,但当我包含它时,代码格式中断了)。
public override void Validate(string userName, string password)
{
using (var context = new ValidityContext())
{
using (var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context)))
{
var user = userManager.Find(userName, password);
if (user == null)
{
var msg = String.Format("Unknown Username {0} or incorrect password {1}", userName, password);
throw new FaultException(msg);//the client actually will receive MessageSecurityException. But if I throw MessageSecurityException, the runtime will give FaultException to client without clear message.
}
else
{
SessionOperationContext.Current.Items["CurrentUser"] = user;
}
}
}
}
任何这方面的帮助将不胜感激。
终于想通了。
解决方案是在IIS服务器上禁用基本身份验证,并覆盖ServiceAuthorizationManager的CheckAccessCore方法来验证用户。