代码之家  ›  专栏  ›  技术社区  ›  Rob

C#验证两个Web应用程序之间的Web服务时出现问题

  •  3
  • Rob  · 技术社区  · 14 年前

    在中央web应用程序中,我有这段代码;

    var clientUri = "http://website.localhost/Services/Info.svc/account";
    var uri = new Uri(clientUri);
    var networkCredentials = new NetworkCredential(_configuration.ServiceUserName, _configuration.ServicePassword);
    var httpClient = new HttpClient();
    
    httpClient.DefaultHeaders.Authorization = Credential.CreateBasic(_configuration.ServiceUserName,                                                                                   _configuration.ServicePassword);
    httpClient.TransportSettings.PreAuthenticate = true;
    
    HttpResponseMessage respone = httpClient.Get(uri);
    HttpContent content = respone.Content;
    

    在另一个应用程序的webservice中(信息.svc),我在服务的构造函数中有以下代码。

    var validator = new UserNamePasswordValidator();
    var cred = System.Net.CredentialCache.DefaultCredentials; //this one is empty, maybe a solution?
    validator.Validate("Username", "Password");
    
    if (!HttpContext.Current.User.Identity.IsAuthenticated)
    {
    //This throws a 401 unauthorize, which is shown as a 500 error in the central application
    throw new WebProtocolException(HttpStatusCode.Unauthorized, "You must be authorized to perform this action.", null);
    }
    else
    {
    _userIsAbleToUseService = true;
    }
    

    我不想在validate函数中使用用户名和密码,而是使用从其他webservice发送的网络凭据,这可以实现吗?怎么做?欢迎您提出其他建议!我现在可以在validate函数中对密码进行harcode,但这不是我想要的。

    --更新--

    <authorization>
                <allow roles="administrators"/>
                <deny roles="datareaders"/>
                <deny users="?"/>
            </authorization>
    
    <authentication mode="Forms">
                <forms loginUrl="~/Logon/Logon" timeout="2880"/>
            </authentication>
            <membership>
                <providers>
                    <clear/>
                    <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ApplicationServices" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" applicationName="CentralApplication"/>
                </providers>
            </membership>
    

    这部分是给web.config文件在第二个webapplication中

    <authentication mode="Forms">
          <forms name="AllPages" loginUrl="~/Logon/" timeout="360" enableCrossAppRedirects="false" />
        </authentication>
        <authorization>
          <!-- NOTE: See Web.config under Private folder for specifics on secure pages. -->
          <deny users="?" />
        </authorization>
    
    <membership defaultProvider="NHMembershipProvider">
          <providers>
            <clear />
            <add name="NHMembershipProvider" applicationName="Website" type="Website.Security.Authentication.Membership.CmsMembershipProvider" description="Stores and retrieves membership data from SQL server using Nhibernate" connectionStringName="NHibernate" enablePasswordRetrieval="true" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="true" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" />
          </providers>
        </membership>
        <roleManager enabled="true" defaultProvider="NHRoleProvider">
          <providers>
            <clear />
            <add name="NHRoleProvider" applicationName="Website" type="Website.Security.Authentication.Membership.CmsRoleProvider" />
          </providers>
        </roleManager>
    

    1 回复  |  直到 14 年前
        1
  •  0
  •   Community uzul    7 年前

    我花了将近两天的时间,但现在一切都正常了。我找到了 WcfRestContrib

    <system.serviceModel>
        <extensions>
          <behaviorExtensions>
            <add name="webAuthentication" type="WcfRestContrib.ServiceModel.Configuration.WebAuthentication.ConfigurationBehaviorElement, WcfRestContrib, Version=1.0.6.107, Culture=neutral, PublicKeyToken=89183999a8dc93b5"/>
            <add name="errorHandler" type="WcfRestContrib.ServiceModel.Configuration.ErrorHandler.BehaviorElement, WcfRestContrib, Version=1.0.6.107, Culture=neutral, PublicKeyToken=89183999a8dc93b5"/>
            <add name="webErrorHandler" type="WcfRestContrib.ServiceModel.Configuration.WebErrorHandler.ConfigurationBehaviorElement, WcfRestContrib, Version=1.0.6.107, Culture=neutral, PublicKeyToken=89183999a8dc93b5"/>
          </behaviorExtensions>
        </extensions>
        <behaviors>
          <serviceBehaviors>
            <behavior name="Rest">
              <webAuthentication requireSecureTransport="false" authenticationHandlerType="WcfRestContrib.ServiceModel.Dispatcher.WebBasicAuthenticationHandler, WcfRestContrib" usernamePasswordValidatorType="CMS.Backend.Services.SecurityValidator, CMS.Backend" source="CMS.Backend"/>
              <!--<webAuthentication requireSecureTransport="false" authenticationHandlerType="CMS.Backend.Services.WebBasicAuthenticationHandler, CMS.Backend" usernamePasswordValidatorType="CMS.Backend.Services.SecurityValidator, Website.Backend" source="CMS.Backend"/>-->
              <errorHandler errorHandlerType="WcfRestContrib.ServiceModel.Web.WebErrorHandler, WcfRestContrib"/>
              <webErrorHandler returnRawException="true" logHandlerType="Website.Backend.Services.LogHandler, Website.Backend" unhandledErrorMessage="An error has occured processing your request. Please contact technical support for further assistance."/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
      </system.serviceModel>
    

    之后,我修改了我的服务接口,使其看起来像这样;

    [ServiceContract]
    public interface ICmsInfo
    {
        [OperationContract]
        [OperationAuthentication]
        [WebInvoke(UriTemplate = "account", Method = "GET")]
        AccountDTO GetAccountInfo();
    

    我采取的最后一步是向服务本身添加2个属性;

    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    [ServiceConfiguration("Rest", true)]
    public class Cmsinfo : ICmsInfo
    {
    //foo
    }
    

    WcfRestContrib通过添加这种身份验证技术给了我很大的帮助,而且效果非常好。我只需要确保我也使用了授权头。

    topic .