【问题标题】:ASP.NET Membership Provider authentication not working authenticating WCF ServiceASP.NET 成员身份提供程序身份验证不起作用对 WCF 服务进行身份验证
【发布时间】:2011-05-01 06:31:49
【问题描述】:

我有一个启用了角色的 SqlMembershipProvider 存储。这是配置的,并且用户“devtest”在角色“xxUser”和“xxAdmin”中。

我还有一个 WCF 服务,我想对其进行身份验证和授权。我的问题是:

  1. 授权不 发生,代码只是执行 尽管有政策属性
  2. 我没有任何身份或安全性 上下文所以不知道是谁 调用服务

我需要:

  1. 知道哪个用户正在呼叫 方法
  2. 某种程度的拒绝 权限不匹配的用户 (理想情况下应该执行 内 RoleProvider/MembershipProvider/WCF 但如果必须,我可以自己做)
  3. 传输中的 SSL

我的服务合同是这样建立的:

    [ServiceContract]
    public interface ISupportService
    {
        [OperationContract]
        [PrincipalPermission(SecurityAction.Demand, Role = "ThisRoleDoesNotExist")]
        List<BaseInterestRate> GetAllBaseInterestRates();
    }

代码很简单:

public class SupportService : ISupportService
{
    public List<BaseInterestRate> GetAllBaseInterestRates()
    {
        OperationContext operationContext = OperationContext.Current;
        ServiceSecurityContext serviceSecurityContext = ServiceSecurityContext.Current; // is always null

        using (xxxEntities entities = new xxxEntities())
        {
            return new List<BaseInterestRate>(entities.BaseInterestRates);
        }
    }}

我的服务配置是这样的:

-->

<behaviors>
  <serviceBehaviors>
      <behavior name="SupportServiceBehavior">
          <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
          <serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="AspNetSqlRoleProvider" />
          <serviceCredentials>
              <userNameAuthentication userNamePasswordValidationMode="MembershipProvider" 
 membershipProviderName="SqlMembershipProvider" />
          </serviceCredentials>
      </behavior>
    <behavior>     
      <serviceMetadata httpGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="false"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />

已经配置了 MembershipProvider:

  <membership defaultProvider="SqlMembershipProvider" >
      <providers>
          <clear/>
          <add name="SqlMembershipProvider"
   connectionStringName="SqlMembershipProvider"
   applicationName="xxx"
   type="System.Web.Security.SqlMembershipProvider" />
      </providers>
  </membership>
  <roleManager enabled="true">
      <providers>
          <clear />
          <add connectionStringName="SqlMembershipProvider" applicationName="xxx"
           name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" />
          <add applicationName="xxx" name="AspNetWindowsTokenRoleProvider"
           type="System.Web.Security.WindowsTokenRoleProvider" />
      </providers>
  </roleManager>

我已按照这些页面上的说明进行操作:

我至少预计证书/传输/等会出现问题。因异常而失败,但我可以直接在 WCF 调用中进行调试。我没有可用的安全上下文/用户上下文,当我使用不属于上述两个角色的用户时(我在上面的代码示例中这样做),我不会被“踢出”。

我的客户端应用程序目前是一个 Web 应用程序,但最终也将提供一个 Windows 窗体应用程序和测试套件。我目前正在使用 ASP.NET WebDev 服务器并且正在运行 .NET 4.0。

我错过了什么吗?

【问题讨论】:

  • ISupportService 实现的属性是什么?
  • 实现类上没有属性。我已经更新了帖子以反映。

标签: asp.net wcf asp.net-membership


【解决方案1】:

我对 WCF Rest 服务有点陌生,但在我自己的测试中,我遇到了与此类似的问题。我看到了这个视频,它有点帮助(即使它不是我想要做的):

http://channel9.msdn.com/blogs/rojacobs/endpointtv-securing-restful-services-with-aspnet-membership

本质上问题在于,在 asp.net 配置下,我必须禁用匿名访问才能使用 MembershipProvider 身份验证:

system.web>
    <authorization>
      <deny users="?" />
    </authorization>
...

【讨论】:

【解决方案2】:

我认为您不能在界面上设置主体权限。 我敢打赌,如果您将其移至服务实现方法上,它将起作用

或者至少因为不同的原因开始中断(我目前被困在这一点上 - 我得到了拒绝访问的异常 - 希望你不要!)

(我也先尝试将它们放在合约界面上)

【讨论】:

    【解决方案3】:

    这是使用 SSL 自托管的 wcf 服务的正确配置:

    <?xml version="1.0"?>
    <configuration>
       <startup>
          <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
       </startup>
       <connectionStrings>
          <add name="mySqlConnection" connectionString="Data Source=.\SQLEXPRESS2012;Integrated Security=SSPI;Initial Catalog=aspnetdb;"/>
       </connectionStrings>
       <system.web>
          <compilation debug="true"/>
          <!-- Configure the Sql Membership Provider -->
          <membership defaultProvider="MySqlMembershipProvider" userIsOnlineTimeWindow="15">
             <providers>
                <clear/>
                <add name="MySqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="mySqlConnection" applicationName="UsersManagementNavigationApplication" enablePasswordRetrieval="false" enablePasswordReset="false" requiresQuestionAndAnswer="false" requiresUniqueEmail="true" passwordFormat="Hashed"/>
             </providers>
          </membership>
    
          <!-- Configure the Sql Role Provider -->
          <roleManager enabled="true" defaultProvider="MySqlRoleProvider">
             <providers>
                <clear/>
                <add name="MySqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="mySqlConnection" applicationName="UsersManagementNavigationApplication"/>
             </providers>
          </roleManager>
       </system.web>
       <system.serviceModel>
          <bindings>
             <webHttpBinding>
                <binding name="webBinding">
                   <security mode="Transport">
                      <transport clientCredentialType="Basic"/>
                   </security>
                </binding>
             </webHttpBinding>
             <basicHttpBinding>
                <binding name="basicBindingConfiguration">
                   <security mode="Transport">
                      <transport clientCredentialType="Basic"/>
                   </security>
                </binding>
             </basicHttpBinding>
          </bindings>
          <behaviors>
             <endpointBehaviors>
                <behavior name="webEndpointBehavior">
                   <webHttp/>
                </behavior>
             </endpointBehaviors>
             <serviceBehaviors>
                <behavior name="webServiceBehavior">
                   <serviceMetadata httpsGetEnabled="true"/>
                   <serviceThrottling/>
                   <serviceDebug/>
                </behavior>
                <behavior name="myServiceBehavior">
                   <!-- Configure role based authorization to use the Role Provider -->
                   <serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="MySqlRoleProvider">
                   </serviceAuthorization>
                   <serviceCredentials>
                      <!-- Configure user name authentication to use the Membership Provider -->
                      <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WcfServiceHTTPSSelfHosted.MyCustomValidator, WcfServiceHTTPSSelfHosted"   />
                   </serviceCredentials>
                   <!-- To avoid disclosing metadata information, set the value below to false before deployment -->
                   <serviceMetadata httpsGetEnabled="true"/>
                   <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
                   <serviceDebug includeExceptionDetailInFaults="false"/>
                </behavior>
             </serviceBehaviors>
          </behaviors>
          <services>
             <service behaviorConfiguration="myServiceBehavior" name="WcfServiceHTTPSSelfHosted.WcfServiceHTTPSSelfHosted">
                <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicBindingConfiguration" contract="WcfServiceHTTPSSelfHosted.IWcfServiceHTTPSSelfHosted"/>
                <endpoint address="web" behaviorConfiguration="webEndpointBehavior" binding="webHttpBinding" bindingConfiguration="webBinding" contract="WcfServiceHTTPSSelfHosted.IWcfServiceHTTPSSelfHosted"/>
                <endpoint address="mex" binding="mexHttpsBinding" bindingConfiguration="" contract="IMetadataExchange"/>
                <host>
                   <baseAddresses>
                      <add baseAddress="https://localhost:50001/WcfServiceHTTPSSelfHosted/"/>
                   </baseAddresses>
                </host>
             </service>
          </services>
       </system.serviceModel>
    </configuration>
    

    如果您想了解更多信息,请查看以下内容:

    http://www.albertoschiassi.it/Home/tabid/55/EntryId/94/Use-ASP-NET-SqlMemberShipProvider-in-WCF-self-hosted-service.aspx

    http://www.albertoschiassi.it/Home/tabid/55/EntryId/95/Use-ASP-NET-SqlMemberShipProvider-in-WCF-self-hosted-service-with-SSL.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-13
      • 2017-12-25
      • 2011-08-29
      • 2016-02-11
      • 1970-01-01
      • 1970-01-01
      • 2014-09-28
      • 2011-02-06
      相关资源
      最近更新 更多