<div dir="ltr"><p class="MsoNormal">Hello all,</p><p class="MsoNormal"><br></p><p class="MsoNormal">I am using shib-cas-authn3 to delegate authentication from
shibboleth 3.1.1 to CAS and I would like to expose extended attributes from
shibboleth above and beyond the uid/person name attribute. I don’t know how to extract the extended attributes that I have
programmatically attached to the HttpServletRequest as well as the [user]
session from AuthenticatedNameTranslator within shib-cas-authn3 (fork <a href="https://github.com/manalotoj/shib-cas-authn3">https://github.com/manalotoj/shib-cas-authn3</a>).
Modified shib-cas-authn3:</p><p class="MsoNormal" style="margin-bottom:0.0001pt"><span style="font-size:10pt;font-family:Consolas;color:black"><br></span></p><p class="MsoNormal" style="margin-bottom:0.0001pt"><b><span style="font-size:10pt;font-family:Consolas;color:rgb(127,0,85)">public</span></b><span style="font-size:10pt;font-family:Consolas;color:black"> </span><b><span style="font-size:10pt;font-family:Consolas;color:rgb(127,0,85)">void</span></b><span style="font-size:10pt;font-family:Consolas;color:black"> doTranslation(</span><b><span style="font-size:10pt;font-family:Consolas;color:rgb(127,0,85)">final</span></b><span style="font-size:10pt;font-family:Consolas;color:black"> HttpServletRequest </span><span style="font-size:10pt;font-family:Consolas;color:rgb(106,62,62)">request</span><span style="font-size:10pt;font-family:Consolas;color:black">, </span><b><span style="font-size:10pt;font-family:Consolas;color:rgb(127,0,85)">final</span></b><span style="font-size:10pt;font-family:Consolas;color:black"> HttpServletResponse </span><span style="font-size:10pt;font-family:Consolas;color:rgb(106,62,62)">response</span><span style="font-size:10pt;font-family:Consolas;color:black">,</span><span style="font-size:10pt;font-family:Consolas"></span></p><p class="MsoNormal" style="margin-bottom:0.0001pt"><span style="font-size:10pt;font-family:Consolas;color:black">...</span></p><p class="MsoNormal" style="margin-bottom:0.0001pt"><span style="font-size:10pt;font-family:Consolas;color:black">
Map<String, Object> </span><span style="font-size:10pt;font-family:Consolas;color:rgb(106,62,62)">principalAttributes</span><span style="font-size:10pt;font-family:Consolas;color:black"> = </span><span style="font-size:10pt;font-family:Consolas;color:rgb(106,62,62)">assertion</span><span style="font-size:10pt;font-family:Consolas;color:black">.getPrincipal().getAttributes();</span><span style="font-size:10pt;font-family:Consolas"></span></p><p class="MsoNormal" style="margin-bottom:0.0001pt"><span style="font-size:10pt;font-family:Consolas;color:black">
</span><span style="font-size:10pt;font-family:Consolas;color:rgb(0,0,192)">logger</span><span style="font-size:10pt;font-family:Consolas;color:black">.debug(</span><span style="font-size:10pt;font-family:Consolas;color:rgb(42,0,255)">"principal
attributes: {}"</span><span style="font-size:10pt;font-family:Consolas;color:black">, </span><span style="font-size:10pt;font-family:Consolas;color:rgb(106,62,62)">principalAttributes</span><span style="font-size:10pt;font-family:Consolas;color:black">.toString());</span><span style="font-size:10pt;font-family:Consolas"></span></p><p class="MsoNormal" style="margin-bottom:0.0001pt"><span style="font-size:10pt;font-family:Consolas;color:black"> </span><span style="font-size:10pt;font-family:Consolas"></span></p><p class="MsoNormal" style="margin-bottom:0.0001pt"><span style="font-size:10pt;font-family:Consolas;color:black">
</span><span style="font-size:10pt;font-family:Consolas;color:rgb(63,127,95)">//
add all other <u>cas</u> attributes to the request</span><span style="font-size:10pt;font-family:Consolas"></span></p><p class="MsoNormal" style="margin-bottom:0.0001pt"><span style="font-size:10pt;font-family:Consolas;color:black">
</span><b><span style="font-size:10pt;font-family:Consolas;color:rgb(127,0,85)">for</span></b><span style="font-size:10pt;font-family:Consolas;color:black"> (Object </span><span style="font-size:10pt;font-family:Consolas;color:rgb(106,62,62)">o</span><span style="font-size:10pt;font-family:Consolas;color:black"> : </span><span style="font-size:10pt;font-family:Consolas;color:rgb(106,62,62)">principalAttributes</span><span style="font-size:10pt;font-family:Consolas;color:black">.entrySet()) {</span><span style="font-size:10pt;font-family:Consolas"></span></p><p class="MsoNormal" style="margin-bottom:0.0001pt"><span style="font-size:10pt;font-family:Consolas;color:black">
</span><span style="font-size:10pt;font-family:Consolas;color:rgb(100,100,100)">@SuppressWarnings</span><span style="font-size:10pt;font-family:Consolas;color:black">(</span><span style="font-size:10pt;font-family:Consolas;color:rgb(42,0,255)">"unchecked"</span><span style="font-size:10pt;font-family:Consolas;color:black">)</span><span style="font-size:10pt;font-family:Consolas"></span></p><p class="MsoNormal" style="margin-bottom:0.0001pt"><span style="font-size:10pt;font-family:Consolas;color:black">
Map.Entry<String,
Object> </span><span style="font-size:10pt;font-family:Consolas;color:rgb(106,62,62)">pair</span><span style="font-size:10pt;font-family:Consolas;color:black"> = (Map.Entry<String, Object>) </span><span style="font-size:10pt;font-family:Consolas;color:rgb(106,62,62)">o</span><span style="font-size:10pt;font-family:Consolas;color:black">;</span><span style="font-size:10pt;font-family:Consolas"></span></p><p class="MsoNormal" style="margin-bottom:0.0001pt"><span style="font-size:10pt;font-family:Consolas;color:black"> </span><span style="font-size:10pt;font-family:Consolas;color:rgb(106,62,62)">request</span><span style="font-size:10pt;font-family:Consolas;color:black">.setAttribute(</span><span style="font-size:10pt;font-family:Consolas;color:rgb(106,62,62)">pair</span><span style="font-size:10pt;font-family:Consolas;color:black">.getKey(), </span><span style="font-size:10pt;font-family:Consolas;color:rgb(106,62,62)">pair</span><span style="font-size:10pt;font-family:Consolas;color:black">.getValue());</span><span style="font-size:10pt;font-family:Consolas"></span></p><p class="MsoNormal" style="margin-bottom:0.0001pt"><span style="font-size:10pt;font-family:Consolas;color:black"> </span><span style="font-size:10pt;font-family:Consolas;color:rgb(106,62,62)">request</span><span style="font-size:10pt;font-family:Consolas;color:black">.getSession().setAttribute(</span><span style="font-size:10pt;font-family:Consolas;color:rgb(106,62,62)">pair</span><span style="font-size:10pt;font-family:Consolas;color:black">.getKey(), </span><span style="font-size:10pt;font-family:Consolas;color:rgb(106,62,62)">pair</span><span style="font-size:10pt;font-family:Consolas;color:black">.getValue());</span><span style="font-size:10pt;font-family:Consolas"></span></p><p class="MsoNormal" style="margin-bottom:0.0001pt"><span style="font-size:10pt;font-family:Consolas;color:black"> </span><span style="font-size:10pt;font-family:Consolas;color:rgb(0,0,192)">logger</span><span style="font-size:10pt;font-family:Consolas;color:black">.debug(</span><span style="font-size:10pt;font-family:Consolas;color:rgb(42,0,255)">"Set the '{}' attribute with value
'{}' in request and session."</span><span style="font-size:10pt;font-family:Consolas;color:black">, </span><span style="font-size:10pt;font-family:Consolas;color:rgb(106,62,62)">pair</span><span style="font-size:10pt;font-family:Consolas;color:black">.getKey(), </span><span style="font-size:10pt;font-family:Consolas;color:rgb(106,62,62)">pair</span><span style="font-size:10pt;font-family:Consolas;color:black">.getValue());</span><span style="font-size:10pt;font-family:Consolas"></span></p><p class="MsoNormal" style="margin-bottom:0.0001pt"><span style="font-size:10pt;font-family:Consolas;color:black">
} </span><span style="font-size:10pt;font-family:Consolas"></span></p><p class="MsoNormal"><span style="font-size:10pt;line-height:107%;font-family:Consolas;color:black"> }</span></p><p class="MsoNormal"><span style="font-size:10pt;line-height:107%;font-family:Consolas;color:black"><br></span></p><p class="MsoNormal"><span style="font-size:10pt;line-height:107%;font-family:Consolas;color:black">I have stubbed and configured everything outside of the
actual retrieval of the extended attributes from within a custom data connector
(refer to <a href="https://github.com/manalotoj/campuslogic-shib3/blob/master/campuslogic-dc/src/main/java/net/campuslogic/shibboleth/dataconnector/CampusLogicCasDataConnector.java">https://github.com/manalotoj/campuslogic-shib3/blob/master/campuslogic-dc/src/main/java/net/campuslogic/shibboleth/dataconnector/CampusLogicCasDataConnector.java</a>); everything works as expected.</span></p><p class="MsoNormal"><br></p><p class="MsoNormal">How do I access either the userSession or the
HttpServletRequest from my custom data connector (extends
AbstractDataConnector)? I have looked at all BaseContext instances (made
available through AttributeResolverContext including getParent() and all of its
context objects) and I can’t find anything. I also tried to use a scripted
attribute resolver configuration but ran into a similar roadblock in that requestContext.userSession
is not available/implemented.</p><p class="MsoNormal"> </p><p class="MsoNormal">Thanks,</p><p class="MsoNormal">
</p><p class="MsoNormal">John</p></div>