예제 #1
0
 public GrepRequestEndpoint(
     IPostHttpMethod postHttpMethod,
     IHttpRequestProcessor <IHttpEndpoint <GrepRequest, string> > httpRequestProcessor,
     IRequireAuthenticationFilter requireAuthenticationFilter,
     IGrepRequestUnbinder unbinder,
     IGrepRequestValidator validator,
     IGrepRequestPerformer performer,
     IGrepRequestFailureHandler stringFailureHandler,
     IStringResponseWritter stringResponseWritter)
 {
     HttpRequestDescriptor = new GenericRequestDescriptor
     {
         HttpMethod       = postHttpMethod,
         RouteDescription = "grep/{for}"
     };
     HttpRequestProcessor = httpRequestProcessor;
     BeforePerformActions = new List <IPrePerformAction> {
         requireAuthenticationFilter
     };
     ResponseWritter       = stringResponseWritter;
     HttpRequestUnbinder   = unbinder;
     Performer             = performer;
     RequestValidator      = validator;
     RequestFailureHandler = stringFailureHandler;
 }
        public AuthenticateServiceEndpoint(
            IServiceEndpointBootstrapper <UsernamePassword, ServiceResponse> bootstrapper,
            IUserRepository userRepository,
            IFormDataReader formDataReader,
            IPostHttpMethod postHttpMethod,
            ISessionGetter sessionGetter,
            IAuthenticationSessionContants contants)
        {
            bootstrapper.Bootstrap(this, postHttpMethod, "authenticate",
                                   (HttpContext httpContext, List <string> messages, out UsernamePassword request) =>
            {
                Dictionary <string, string> formData;
                if (formDataReader.ReadFormData(httpContext.HttpRequest.InputStream, messages, out formData) == false)
                {
                    request = null;
                    return(false);
                }
                request = new UsernamePassword
                {
                    Username = formData["username"],
                    Password = formData["password"]
                };
                if (request.Username != null)
                {
                    request.Username = request.Username.Trim();
                }
                return(true);
            },
                                   perform: (httpContext, request) =>
            {
                ServiceResponse serviceResponse;
                var session = sessionGetter.GetSession(httpContext);
                if (session[contants.Authenticated] == true.ToString())
                {
                    serviceResponse = new ServiceResponse
                    {
                        Success  = true,
                        Messages = new List <string> {
                            "Already authenticated"
                        }
                    };
                }
                else if (userRepository.Authenticate(request.Username, request.Password))
                {
                    session[contants.Username]      = request.Username;
                    session[contants.Authenticated] = true.ToString();
                    serviceResponse = new ServiceResponse
                    {
                        Success  = true,
                        Messages = new List <string> {
                            "Successfully authenticated"
                        }
                    };
                }
                else
                {
                    httpContext.HttpResponse.HttpStatusCode = HttpStatusCode.Forbidden;
                    serviceResponse = new ServiceResponse
                    {
                        Success  = false,
                        Messages = new List <string> {
                            "Invalid username or password"
                        }
                    };
                }

                var returnUrl = session[contants.ReturnUrl];
                if (serviceResponse.Success && returnUrl != null)
                {
                    session.Remove(contants.ReturnUrl);
                    httpContext.HttpResponse.HttpStatusCode = HttpStatusCode.Redirect;
                    httpContext.HttpResponse.Headers.Add("Location:", returnUrl);
                }

                return(serviceResponse);
            },
                                   validate: (request, messages) =>
            {
                if (string.IsNullOrWhiteSpace(request.Username))
                {
                    messages.Add("No 'username' is set.");

                    return(false);
                }

                return(true);
            },
                                   requestFailureHandler: (httpContext, requestFailedAt, messages, request) =>
            {
                httpContext.HttpResponse.HttpStatusCode = HttpStatusCode.Forbidden;
                var serviceResponse = new ServiceResponse
                {
                    Success  = false,
                    Messages = new List <string>()
                };
                serviceResponse.Messages.AddRange(messages);
                return(serviceResponse);
            });
        }