Asp.net 使用WCF进行表单身份验证和访问身份验证\u JSON\u AppService.axd时返回错误302

Asp.net 使用WCF进行表单身份验证和访问身份验证\u JSON\u AppService.axd时返回错误302,asp.net,.net,wcf,Asp.net,.net,Wcf,我有一个客户端和应用程序,它们被设置为使用ClientFormAuthenticationMembershipProvider进行身份验证。在客户端,当应用程序启动时,系统会提示输入用户名和密码。服务器被设置为接受这一点,Web应用程序应该允许应用程序工作。我们正在建立一个新的环境,但服务器端有些东西不起作用(如果我们将客户端指向另一台服务器,它就可以正常工作)。我们煞费苦心地研究了我们所能想到的每一个细节,结果都是一样的:对ValidateUser()的调用引发了一个异常。我下载了一个网络嗅探

我有一个客户端和应用程序,它们被设置为使用ClientFormAuthenticationMembershipProvider进行身份验证。在客户端,当应用程序启动时,系统会提示输入用户名和密码。服务器被设置为接受这一点,Web应用程序应该允许应用程序工作。我们正在建立一个新的环境,但服务器端有些东西不起作用(如果我们将客户端指向另一台服务器,它就可以正常工作)。我们煞费苦心地研究了我们所能想到的每一个细节,结果都是一样的:对ValidateUser()的调用引发了一个异常。我下载了一个网络嗅探器,在我尝试调用Authentication_JSON_AppService.axd时,我可以看到返回了一条302消息。在服务器端,ProcMon注册尝试从wwwroot/./Authentication\u JSON\u AppService.axd中读取Authentication\u JSON\u AppService.axd文件,该文件显然不存在

客户端配置: 从我们的FormMain.cs(尝试调用提供程序)

从我们的FormLogin.cs(提示输入用户名和密码)注意:类继承 IClientFormAuthenticationCredentialsProvider

    public System.Web.ClientServices.Providers.ClientFormsAuthenticationCredentials GetCredentials()
    {
        if (this.ShowDialog() == DialogResult.OK)
        {
            return new ClientFormsAuthenticationCredentials(
                textEditUsername.Text, textEditPassword.Text,
                false);
        }
        else
        {
            return null;
        }

    }
从app.config:

    <membership defaultProvider="ClientAuthenticationMembershipProvider">
      <providers>
        <clear />
        <add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="http://SERVERNAME/APPNAME/Authentication_JSON_AppService.axd" credentialsProvider="APPNAME.Windows.FormLogin, APPNAME.Windows" savePasswordHashLocally="False" />
      </providers>
    </membership>

在服务器端: 已为此应用程序配置IIS以进行匿名身份验证和表单身份验证。(我们正在运行IIS 7.5、.NET 4.0、Windows Server 2008 R2)。我们在服务器上安装了WCF激活和HTTP激活功能。ApplicationPool设置为v4.0 Framework,未启用32位应用程序,集成管线模式,大多数其他值设置为默认值

web.config文件:

  <system.web.extensions>
    <scripting>
      <webServices>
         <authenticationService enabled="true" />
         <roleService enabled="true" />
       </webServices>
     </scripting>
   </system.web.extensions>
     <authentication mode="Forms">
       <forms name=".MDPSApp" loginUrl="~/Connect/Login.aspx" slidingExpiration="true" timeout="600000">
       </forms>
     </authentication>
     <authorization>
       <deny users="?" />
     </authorization>
     <membership defaultProvider="XYZ">
       <providers>
         <add name="XYZ" type="APPNAME.Web.Providers.MembershipProvider, APPNAME.Web" />
       </providers>
     </membership>
 <system.serviceModel>
     <bindings>
       <wsHttpBinding>
         <binding name="DisableAutoCookieManagement" maxReceivedMessageSize="2147483647" allowCookies="false">
           <readerQuotas maxDepth="64" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
           <security mode="None" />
         </binding>
       </wsHttpBinding>
     <behaviors>
 <serviceBehaviors>
         <behavior name="APPNAME.Application.Web.Services.AgenceMaster.ServiceAgenceMasterBehavior">
           <serviceMetadata httpGetEnabled="true" />
           <serviceDebug includeExceptionDetailInFaults="true" />
           <serviceAuthorization principalPermissionMode="None">
           </serviceAuthorization>
         </behavior>
         <behavior name="APPNAME.Application.Web.Services.Agence.ServiceAgenceBehavior">
           <serviceMetadata httpGetEnabled="true" />
           <serviceDebug includeExceptionDetailInFaults="true" />
         </behavior>
       </serviceBehaviors>
     </behaviors>
 <services>
       <service behaviorConfiguration="APPNAME.Application.Web.Services.AgenceMaster.ServiceAgenceMasterBehavior" name="APPNAME.Application.Web.Services.AgenceMaster.ServiceAgenceMaster">
         <endpoint address="" binding="wsHttpBinding" bindingConfiguration="DisableAutoCookieManagement" contract="APPNAME.Services.AgenceMaster.IServiceAgenceMaster">
           <identity>
             <dns value="localhost" />
           </identity>
         </endpoint>
         <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
       </service>
       <service behaviorConfiguration="APPNAME.Application.Web.Services.Agence.ServiceAgenceBehavior" name="APPNAME.Application.Web.Services.Agence.ServiceAgence">
         <endpoint address="" binding="wsHttpBinding" bindingConfiguration="DisableAutoCookieManagement" contract="APPNAME.Services.Agence.IServiceAgence">
           <identity>
             <dns value="localhost" />
           </identity>
         </endpoint>
         <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
       </service>
     </services>
     <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
   </system.serviceModel>

APPNAME.Web.Providers.MembershipProvider类扩展System.Web.Security.MembershipProvider并使用自定义代码覆盖ValidateUser(字符串用户名、字符串密码)。在该场景中,未实例化或调用此类


服务器端的某些配置不正确,否则服务器将知道如何正确解析Authentication_JSON_AppService.axd调用(在我看来似乎不是这样)。感谢您的任何想法或帮助

这让我发疯。在FireFox中,如果我输入调用WCF REST调用的*.aspx页面的URL,一切都正常。如果我再进行一次轮班重新加载,我会得到一个302,它将我重定向到一个不存在的表单登录页面

在Safari和Chrome中-无需换班。第一次加载302时,它将失败

我在报告中找到了基本答案

简短回答:更改web.config以删除表单身份验证:

<modules runAllManagedModulesForAllRequests="true">
  <remove name="FormsAuthentication" />
</modules>

<modules runAllManagedModulesForAllRequests="true">
  <remove name="FormsAuthentication" />
</modules>