基本身份验证和 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;
                }
            }
        }
    }

任何这方面的帮助将不胜感激。

基本身份验证和 WCF REST 服务配置出现问题

终于想通了。

解决方案是在IIS服务器上禁用基本身份验证,并覆盖ServiceAuthorizationManager的CheckAccessCore方法来验证用户。