diff --git a/trac/ticket/templates/ticket.html b/trac/ticket/templates/ticket.html
--- a/trac/ticket/templates/ticket.html
+++ b/trac/ticket/templates/ticket.html
@@ -137,9 +137,12 @@
                                     not in ('type', 'owner')]">
             <tr>
               <th id="h_reporter">Reported by:</th>
-              <td headers="h_reporter" class="searchable">${reporter_link}</td>
+              <td headers="h_reporter" class="searchable">
+                ${defined('reporter_link') and reporter_link or authorinfo(ticket.reporter)}
+              </td>
               <th id="h_owner">Owned by:</th>
-              <td headers="h_owner">${owner_link}
+              <td headers="h_owner">
+                ${defined('owner_link') and owner_link or authorinfo(ticket.owner)}
               </td>
             </tr>
             <tr py:for="row in group(fields, 2, lambda f: f.type != 'textarea')"
diff --git a/trac/ticket/web_ui.py b/trac/ticket/web_ui.py
--- a/trac/ticket/web_ui.py
+++ b/trac/ticket/web_ui.py
@@ -1270,6 +1270,14 @@
             ticket.values.update(values)
 
         context = Context.from_request(req, ticket.resource)
+
+        # Display the owner and reporter links when not obfuscated
+        chrome = Chrome(self.env)
+        for user in 'reporter', 'owner':
+            if chrome.format_author(req, ticket[user]) == ticket[user]:
+                data['%s_link' % user] = self._query_link(req, user,
+                                                            ticket[user])
+
         data.update({
             'context': context,
             'fields': fields, 'changes': changes,
@@ -1278,8 +1286,6 @@
             'action_controls': action_controls,
             'action': selected_action,
             'change_preview': change_preview,
-            'reporter_link': self._query_link(req, 'reporter', ticket['reporter']),
-            'owner_link': self._query_link(req, 'owner', ticket['owner'])
         })
 
     def rendered_changelog_entries(self, req, ticket, when=None):

