Er nahm aufseiten der Union am Sezessionskrieg teil, in den er 1861 als einfacher Soldat marschierte und aus dem er als Major ehrenhaft entlassen wurde, wobei er zeitweise unter dem späteren Präsidenten Rutherford B. Hayes diente. Er kämpfte während des Kriegs unter anderem in den Schlachten am Antietam, bei Kernstown und am Cedar Creek. McKinley wurde 1876 für Ohio ins US-Repräsentantenhaus gewählt. Dort war er Wortführer einer strikten Schutzzollpolitik, womit er den Wünschen seiner industriellen Klientel entsprach, die aber 1890 eine schwere Wahlniederlage seiner Partei hervorrief. Dennoch wurde er im November 1891 zum Gouverneur von Ohio gewählt. Dieses Amt trat er Anfang 1892 an und übte es bis Januar 1896 aus. Während seiner Zeit als Gouverneur zeigte er Sympathien für Gewerkschaften und setzte sich für Arbeitnehmerrechte ein.