2013-09-03 6 views
1

최근에 WCF 보안 가이드를 읽었으며 사용자가 자신의 계정을 만들고 메시지 보안을 사용하여 응용 프로그램에 액세스해야하는 응용 프로그램을 만드는 데 사용하고 있습니다. 아래는 지금까지 책에서 나온 web.config 파일입니다. 내가 가지고있는 문제는 사용자 등록과 관련된 것입니다. 응용 프로그램에 사용자 이름/암호 인증이 필요하므로 새 사용자를 등록하는 방법이 일관되게 실패합니다.단일 작업으로 WCF 인증을 사용할 수 없게 할 수 있습니까?

롤 기반 인증으로 전환하고 등록 권한이있는 역할로 단일 사용자를 만들고 그 정보를 등록 방법으로 하드 코딩하는 방법을 알고 있지만 대안 솔루션을 찾고 있습니다. 특정 메소드가 인증을 필요로하지 않음을 운영 레벨에서 선언하는 방법이 있습니까? 그렇지 않은 경우, 다른 서비스 계약을 사용하여 별도의 엔드 포인트를 노출하고 인증을 필요로하지 않는 계약이 있습니까? Web.config 파일의 상당 부분은 회원 공급자와 메시지 보안과 관련이 있습니다. 조금 걱정이지만, 데이터베이스에 새로운 멤버를 올바르게 등록하는 방법은 회원 공급자에 대해 분명히 알고 있어야합니다 ...

<?xml version="1.0"?> 
<configuration> 

    <appSettings> 
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> 
    </appSettings> 
    <connectionStrings> 
    <add name="MyLocalSQLServer" 
     connectionString="Initial Catalog=aspnetdb;data source=DESKTOP;Integrated Security=SSPI;"/> 
    </connectionStrings> 
    <system.web> 
    <authentication mode="Forms" /> 
    <compilation debug="true" targetFramework="4.5" /> 
    <httpRuntime targetFramework="4.5"/> 
    <membership defaultProvider="MySqlMembershipProvider"> 
     <providers> 
     <clear /> 
     <add name="mySqlMembershipProvider" 
      connectionStringName="MyLocalSQLServer" 
      applicationName="Mech" 
      type="System.Web.Security.SqlMembershipProvider" /> 
     </providers> 
    </membership>     
    </system.web> 
    <system.serviceModel> 
    <bindings> 
     <wsDualHttpBinding> 
     <binding name="wsDualHttpEndpointBinding"> 
      <security> 
      <message clientCredentialType="UserName" /> 
      </security> 
     </binding> 
     </wsDualHttpBinding> 
    </bindings> 
    <services> 
     <service name="MechService.MechService"> 
     <endpoint address="localhost/MechService" binding="wsDualHttpBinding" bindingConfiguration="wsDualHttpEndpointBinding" 
      name="wsDualHttpEndpoint" contract="MechService.IMechService" /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="false" /> 
      <serviceCredentials> 
      <serviceCertificate findValue="CN=TempCert" /> 
      <userNameAuthentication userNamePasswordValidationMode="MembershipProvider" 
       membershipProviderName="MySqlMembershipProvider" /> 
      </serviceCredentials> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <protocolMapping> 
     <add binding="basicHttpsBinding" scheme="https" /> 
    </protocolMapping>  
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    <!-- 
     To browse web app root directory during debugging, set the value below to true. 
     Set to false before deployment to avoid disclosing web app folder information. 
     --> 
    <directoryBrowse enabled="true"/> 
    </system.webServer> 

</configuration> 

새로운 사용자를 등록하는 기능입니다.

public string CreateUser(String Name, String Password, String Email, String Question, String Answer) 
    { 
     MembershipCreateStatus status; 

     try 
     { 
      MembershipUser newUser = Membership.CreateUser(Name, Password, Email, Question, Answer, true, out status); 

      if (newUser == null) 
      { 
       return GetErrorMessage(status); 
      } 
      else 
      { 
       return "MECH_CODE_SUCCESS"; 
      } 
     } 
     catch (Exception ex) 
     { 
      return ex.Message; 
     } 
    } 

답변

1

(당신이 권한을 선택할 수 있지만 그러나 이것은 당신에게 노트 helpfull입니다) 당신은 한 번의 작업에서 인증을 선택할 수 없습니다. 좋은 소식은 엔드 포인트마다 인증 설정이 있고 엔드 포인트마다 하나의 계약이 있다는 것입니다. 따라서 registerUser 작업을 새 ServiceContract로 이동하고 인증없이 별도의 바인딩을 만듭니다.

+0

고마워요! 이것은 효과가있다. –