diff --git a/src/main/edu/wisc/doit/uwphps/UserDetailsProvider.php b/src/main/edu/wisc/doit/uwphps/UserDetailsProvider.php
index f211ca7ebc1959ea6c5b88a970704e855fc5454a..9ebd73553b2186a0b6a77b81140c8795fd079d34 100644
--- a/src/main/edu/wisc/doit/uwphps/UserDetailsProvider.php
+++ b/src/main/edu/wisc/doit/uwphps/UserDetailsProvider.php
@@ -49,8 +49,8 @@ abstract class UserDetailsProvider
      *
      * @see https://wiki.shibboleth.net/confluence/display/SHIB2/NativeSPAttributeAccess NativeSPAttributeAccess
      */
-    protected function httpHeaderFromAttribute($attribute)
+    public static function httpHeaderFromAttribute($attribute)
     {
-        return 'HTTP_' . strtoupper($attribute);
+        return 'HTTP_' . strtoupper(str_replace('-', '_', $attribute));
     }
 }
diff --git a/src/main/edu/wisc/doit/uwphps/preauth/FederatedPreauthUserDetailsProvider.php b/src/main/edu/wisc/doit/uwphps/preauth/FederatedPreauthUserDetailsProvider.php
index baafe052d3895e0f8edec6d81066ee56714caffd..48dfdf1c0e202faba715a96eaa0a03cd20cd74d6 100644
--- a/src/main/edu/wisc/doit/uwphps/preauth/FederatedPreauthUserDetailsProvider.php
+++ b/src/main/edu/wisc/doit/uwphps/preauth/FederatedPreauthUserDetailsProvider.php
@@ -34,15 +34,15 @@ class FederatedPreauthUserDetailsProvider extends UserDetailsProvider
 
         if ($this->httpHeaders) {
             $userDetails = new UWUserDetails(
-                getenv($this->httpHeaderFromAttribute(static::EPPN)),
-                getenv($this->httpHeaderFromAttribute(static::SPVI)),
-                getenv($this->httpHeaderFromAttribute(static::FULL_NAME)),
-                explode(static::DELIMITER, getenv($this->httpHeaderFromAttribute(static::UDDS))),
-                getenv($this->httpHeaderFromAttribute(static::EMAIL)),
-                getenv($this->httpHeaderFromAttribute(static::SOURCE)),
-                getenv($this->httpHeaderFromAttribute(static::ISIS_EMPLID)),
-                getenv($this->httpHeaderFromAttribute(static::FIRST_NAME)),
-                getenv($this->httpHeaderFromAttribute(static::LAST_NAME))
+                getenv(UserDetailsProvider::httpHeaderFromAttribute(static::EPPN)),
+                getenv(UserDetailsProvider::httpHeaderFromAttribute(static::SPVI)),
+                getenv(UserDetailsProvider::httpHeaderFromAttribute(static::FULL_NAME)),
+                explode(static::DELIMITER, getenv(UserDetailsProvider::httpHeaderFromAttribute(static::UDDS))),
+                getenv(UserDetailsProvider::httpHeaderFromAttribute(static::EMAIL)),
+                getenv(UserDetailsProvider::httpHeaderFromAttribute(static::SOURCE)),
+                getenv(UserDetailsProvider::httpHeaderFromAttribute(static::ISIS_EMPLID)),
+                getenv(UserDetailsProvider::httpHeaderFromAttribute(static::FIRST_NAME)),
+                getenv(UserDetailsProvider::httpHeaderFromAttribute(static::LAST_NAME))
             );
         } else {
             $userDetails = new UWUserDetails(
diff --git a/src/main/edu/wisc/doit/uwphps/preauth/PreauthUserDetailsProvider.php b/src/main/edu/wisc/doit/uwphps/preauth/PreauthUserDetailsProvider.php
index 2406b38c705d411261b8647bf323eaa27c905163..31f826116c9ce2d19bd6a748c713aa0ec6d990c9 100644
--- a/src/main/edu/wisc/doit/uwphps/preauth/PreauthUserDetailsProvider.php
+++ b/src/main/edu/wisc/doit/uwphps/preauth/PreauthUserDetailsProvider.php
@@ -36,15 +36,15 @@ class PreauthUserDetailsProvider extends UserDetailsProvider
 
         if ($this->httpHeaders) {
             $userDetails = new UWUserDetails(
-                getenv($this->httpHeaderFromAttribute(static::EPPN)),
-                getenv($this->httpHeaderFromAttribute(static::PVI)),
-                getenv($this->httpHeaderFromAttribute(static::FULL_NAME)),
-                explode(static::DELIMITER, getenv($this->httpHeaderFromAttribute(static::UDDS))),
-                getenv($this->httpHeaderFromAttribute(static::EMAIL)),
-                getenv($this->httpHeaderFromAttribute(static::SOURCE)),
-                getenv($this->httpHeaderFromAttribute(static::ISIS_EMPLID)),
-                getenv($this->httpHeaderFromAttribute(static::FIRST_NAME)),
-                getenv($this->httpHeaderFromAttribute(static::LAST_NAME))
+                getenv(UserDetailsProvider::httpHeaderFromAttribute(static::EPPN)),
+                getenv(UserDetailsProvider::httpHeaderFromAttribute(static::PVI)),
+                getenv(UserDetailsProvider::httpHeaderFromAttribute(static::FULL_NAME)),
+                explode(static::DELIMITER, getenv(UserDetailsProvider::httpHeaderFromAttribute(static::UDDS))),
+                getenv(UserDetailsProvider::httpHeaderFromAttribute(static::EMAIL)),
+                getenv(UserDetailsProvider::httpHeaderFromAttribute(static::SOURCE)),
+                getenv(UserDetailsProvider::httpHeaderFromAttribute(static::ISIS_EMPLID)),
+                getenv(UserDetailsProvider::httpHeaderFromAttribute(static::FIRST_NAME)),
+                getenv(UserDetailsProvider::httpHeaderFromAttribute(static::LAST_NAME))
             );
         } else {
             $userDetails = new UWUserDetails(
diff --git a/src/test/edu/wisc/doit/uwphps/UserDetailsProviderTest.php b/src/test/edu/wisc/doit/uwphps/UserDetailsProviderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..0ce2e41ce1251a763eb7b48085d4cf0f053035a9
--- /dev/null
+++ b/src/test/edu/wisc/doit/uwphps/UserDetailsProviderTest.php
@@ -0,0 +1,27 @@
+<?php
+namespace edu\wisc\doit\uwphps;
+
+use PHPUnit\Framework\TestCase;
+
+/**
+ * Tests for {@link UserDetailsProvider} concrete methods.
+ */
+class UserDetailsProviderTest extends TestCase
+{
+
+    /** @var UserDetailsProvider */
+    private $provider;
+
+    public function setUp()
+    {
+        // Must use a mock because it is an abstract class
+        $this->provider = $this->getMockForAbstractClass(UserDetailsProvider::class);
+    }
+
+    /** @test */
+    public function convertsAttributeToHttpHeader()
+    {
+        $this->assertEquals('HTTP_STARFLEETRANK', UserDetailsProvider::httpHeaderFromAttribute('starfleetRank'));
+        $this->assertEquals('HTTP_SHIB_SESSION_ID', UserDetailsProvider::httpHeaderFromAttribute('Shib-Session-Id'));
+    }
+}