Esempio n. 1
0
        internal bool Authenticate(HttpListenerContext context)
        {
            var schm = SelectAuthenticationScheme(context);

            if (schm == AuthenticationSchemes.Anonymous)
            {
                return(true);
            }

            if (schm != AuthenticationSchemes.Basic && schm != AuthenticationSchemes.Digest)
            {
                context.Response.Close(HttpStatusCode.Forbidden);
                return(false);
            }

            var realm = Realm;
            var req   = context.Request;
            var user  = HttpUtility.CreateUser(
                req.Headers["Authorization"], schm, realm, req.HttpMethod, UserCredentialsFinder);

            if (user != null && user.Identity.IsAuthenticated)
            {
                context.User = user;
                return(true);
            }

            if (schm == AuthenticationSchemes.Basic)
            {
                context.Response.CloseWithAuthChallenge(
                    AuthenticationChallenge.CreateBasicChallenge(realm).ToBasicString());
            }

            if (schm == AuthenticationSchemes.Digest)
            {
                context.Response.CloseWithAuthChallenge(
                    AuthenticationChallenge.CreateDigestChallenge(realm).ToDigestString());
            }

            return(false);
        }
 internal AuthenticationResponse(
     AuthenticationChallenge challenge, NetworkCredential credentials, uint nonceCount)
     : this(challenge.Scheme, challenge.Parameters, credentials, nonceCount)
 {
 }
Esempio n. 3
0
    // As client
    private HttpResponse sendHandshakeRequest ()
    {
      var req = createHandshakeRequest ();
      var res = sendHttpRequest (req, 90000);
      if (res.IsUnauthorized) {
        var chal = res.Headers["WWW-Authenticate"];
        _logger.Warn (String.Format ("Received an authentication requirement for '{0}'.", chal));
        if (chal.IsNullOrEmpty ()) {
          _logger.Error ("No authentication challenge is specified.");
          return res;
        }

        _authChallenge = AuthenticationChallenge.Parse (chal);
        if (_authChallenge == null) {
          _logger.Error ("An invalid authentication challenge is specified.");
          return res;
        }

        if (_credentials != null &&
            (!_preAuth || _authChallenge.Scheme == AuthenticationSchemes.Digest)) {
          if (res.HasConnectionClose) {
            releaseClientResources ();
            setClientStream ();
          }

          var authRes = new AuthenticationResponse (_authChallenge, _credentials, _nonceCount);
          _nonceCount = authRes.NonceCount;
          req.Headers["Authorization"] = authRes.ToString ();
          res = sendHttpRequest (req, 15000);
        }
      }

      if (res.IsRedirect) {
        var url = res.Headers["Location"];
        _logger.Warn (String.Format ("Received a redirection to '{0}'.", url));
        if (_enableRedirection) {
          if (url.IsNullOrEmpty ()) {
            _logger.Error ("No url to redirect is located.");
            return res;
          }

          Uri uri;
          string msg;
          if (!url.TryCreateWebSocketUri (out uri, out msg)) {
            _logger.Error ("An invalid url to redirect is located: " + msg);
            return res;
          }

          releaseClientResources ();

          _uri = uri;
          _secure = uri.Scheme == "wss";

          setClientStream ();
          return sendHandshakeRequest ();
        }
      }

      return res;
    }
 internal AuthenticationResponse (
   AuthenticationChallenge challenge, NetworkCredential credentials, uint nonceCount)
   : this (challenge.Scheme, challenge.Parameters, credentials, nonceCount)
 {
 }