SAML assertion from ADFS has a null SessionNotOnOrAfter attribute value - saml

I am working on enabling login to IDP (ADFS 3.0 in my case) from my server(SP) and I am using spring SAML plugin for the same. I am able to make login and logout working. But I have issue with token expiry.
After authentication, I can see an ExpiringUsernameAuthenticationToken generated and set in the securityContext, but the ExpiringUsernameAuthenticationToken.getTokenExpiration() is returned as null in my case. I was under the assumption that this field will be returned from the Idp(ADFS) as part of AuthNRequest in SamlAssertion.
I further debugged the getExpirationDate method of SAMLAuthenticationProvider and verified that the statement.getSessionNotorAfter() indeed returns null.
The ADFS server and the SP server is in different domains and thus has a time difference of more than 12 hours. Do you think this is an issue?
Any configurations needed from the IDP side (ADFS) so that SP will recieve this value?
I am stuck here and any help is appreciated. Thanks in advance.

Related

Which items to verify in SAMLResponse for single sigin on(SSO)?

I"m going to make SSO function by SAML2.0.
And I'm searching what item to be verified in response & assertion of SAMLResponse.
But there is no clear answer and suggestion.
I just read 4.1.4.3 Message Processing Rules, but not sure which items they are.
https://docs.oasis-open.org/security/saml/v2.0/saml-profiles-2.0-os.pdf
Thanks in advance.
You can use the SAML Response with Signed Assertion here to see what's in a typical one.
If you want someone to login to your app using SAML, your app first has to satisfy itself that the user is who they claim to be. It does that by verifying the SignedInfo on the Response. It uses the public key of the IdP to do that. Your app is the SP and should know how to find the public key of the Idp, from its SAML metadata. You can use the Issuer to get the IdP's entityID. Then, in AudienceRestriction, make sure the Response is intended for your app.
Once the basic verification passes, you can use the AttributeStatement to create an account for the user. The Attributes you need for that are in there.
So it's essentially a two part process. In the first part, you make sure the Response is valid, comes from the expected IdP and is intended for your app.
The second part is using the Attributes to manage an account for the user in your app.
There are various refinements such as NotBefore and NotOnOrAfter for Attribute values but those are the basic steps.

SAML SSO: keeping users logged in after validating the SAML Assertion

I am implementing front-channel SAML 2.0 SSO golang Service Provider, with Okta as my Identity Provider (this is just a POC and should eventually work with any IdP).
Implementing the sign on process was straightforward with saml2 package. I've created the login endpoint that redirects to the SAML application login URL at the intended IdP, as well as the POST callback endpoint which is properly receiving the SAML assertion and is able to validate it. After that a session with a random cookie is created with the same TTL as the Identity Provider session TTL. So far everything works well (I haven't implemented Single Sign-Out yet, but I'm planning to).
However, when some time passes and the session expires, I'd like to renew it only if the user is still logged in with the Idp and hasn't been removed from the SAML Application. I would like to avoid redirecting the user to perform SSO again with IdP, because it would mean that if they are still logged in, they would be redirected back to the home page of my application. I wasn't able to find great sources on my options to go about it online.
Questions:
1.1 One solution that comes to mind is storing the requested URL in the RelayState parameter, whenever the session has expired, then redirect the user to the IdP SSO URL. When the redirect returns to the SAML callback POST endpoint, check the RelayState parameter and if set, redirect back to that (original) URL. That means that for users that use the system continuously, I would have to request Assertions very often. Does that make sense?
1.2 A second solution that comes to mind is to implement a back-channel of communicating directly from my SP to the IdP. That would allow me to verify a user is still logged in 'behind the users back'. If that's a sound idea:
a. Do I need to have dedicated code for each IdP?
b. Do I need to load an API key to the IdP which would allow secure communication?
c. Do I need to upload a public certificate to the IdP that would be able to verify that my SP signed the requests?
Will using the Assertion to get an OAuth 2.0 Access Token help me in achieving this?
I've chosen SAML 2.0 for now, since the environment is an enterprise oriented one and I thought it fits well with it based on what I read. Would using OpenID Connect instead help achieve my goals easier and fit well with enterprise oriented products?

Issue with Retrieving SAML Assertion attributes in request header

I am trying to implement SAML Based SP Initiated Single-sign on using openSSO. Post the authentication request validated on IdP side, it passes the SAMLResponse via post redirect to
spAssertionConsumer.jsp to SP. Till this point I am getting the SAML Response. As we are using Sun Java System Web Server, I have installed the respective policy agent, and in Session Attributes Processing I have mapped the required attributes as well.
I have mentioned the Relay State URL as my application URL which is a separate domain from the openSSO installed one. When the response getting redirected from openSSO to our application I am not getting any SAML Assertion attributes in request header or Cookies.
I am not sure what probably would have gone wrong here> If anyone provides some clarification on it, its highly helpful. Thanks.
In order to debug de SAML flow I recomend you to use the [SAML Tracer plugin for firefox][1]
There are a lot of things that could be failing. Review that the IdP is sending a SUCCESS status, that the assertion of the response has the expected attributes, check that the response is valid, check if is there any sign or encryption that the SP can't handle
If not wrong data detected, I recomend you to create a basic app under the domain of the openSSO and check if this app retrieve the attributes, due other problem that could been happen is that you final app is not getting the attributes due can't read the session that was stored by OpenSSO.
Usually the SP software is located at the same machine of the final software in order to share the session...but you could store the session at the OpenSSO at a shared memcached server that is accessed by your final app
[1] https://addons.mozilla.org/es/firefox/addon/saml-tracer/

Are SAML tokens cache/stored anywhere on the browser?

Scenario:
Browser(User) requests resource from Service Provider (SP).
SP Redirects (with SAML Request) to Identity Provider (IdP).
Since it is first login, User gives the (IdP) his/her valid credentials.
IdP then redirects Browser (with SAML Response which includes SAML token) to the SP page.
I have two questions:
A. In Step 4, does the Browser store or cache the SAML Response and/or SAML token?
B. If yes, what kind of things (attributes? timeouts? protocols?) prevent me from taking that stored SAML token. Then coping it over to another computer (with a new session) and using that token to Login to the same SP?
The answer is "sort of" re caching. In your scenario, the Response will be sent via POST to the Service Provider from the browser. So the browser can "cache" the POST data that contains the SAML Response. So, just like any other POST event in browsers, if the user were to use the back button enough times after logging into the SP to get back to the POST event, the POST data could be resent to the SP.
There are a few things that help keep the Response from being hijacked -
Use of HTTPS between all parties
SP enforcement of NotBefore & NotOnOrAfter attributes
SP enforcement of one time use criteria (the SP must ensure that Response is not re-used during its validity period. If the message is received outside the validity window, then the SP should discard the message)
The IDP usually stores a session cookie on the client browser identifying the SAML session. The theft of this session cookie is probably no more protected then any other session cookie.
Using HTTPS in communication between SP and IDP will provide a great deal of protection from session hijacking.
For question A, it probably depends on the browser that you use.
For question B, there are several mechanisms that prevent the SAML response from being reused:
SubjectConfirmationData has attribute NotBefore and NotOnOrAfter that specify the time frame that the SAML assertion is valid. Thus, the SAML assertion cannot be used outside of this time frame.
SubjectConfirmationData has attribute InResponseTo that specifies the SAML request for which the SAML assertion is issued. Thus, the SAML assertion cannot be used for other SAML request.
SP must ensure that the SAML assertion is not replayed by maintaining a set of used SAML assertion.
You can read Section 4.1.4.3 and 4.1.4.5 of SAML Profiles specification.
I know this old, but the answer is yes the browser stores the SAML Token as a Cookie. (Typically) You can see it in your Browser's Cookie list, through various traffic/session inspectors like Fiddler, SAML Tracer on FF etc.

Force reauthenticate with adfs

I have seen a similar post but that was more related to ASP. I will explain my situation below.
I am developing a SP(Relying Party) and integrating with ADFS (IDP). Since I am in the integration phase, I want ADFS to forget that I have previously authenticated so that each time I hit the ADFS endpoint (/adfs/ls) with AuthnRequest, I want it to ask for my credentials.
I believe ADFS by default, remembers clients by their remote IP/host name so clearing cookies on client machine does not help. There was a post that gave a link to logout from IDP (https:///adfs/ls/?wa=wsignout1.0&wreply=https:///adfs/ls/?wa=wsignoutcleanup1.0). The ADFS says I have been logged out but when I hit ADFS endpoint, ADFS redirects back to SP with successful AuthResponse.
Can you please tell me how to force reauthenticate/logout on ADFS or point me to the right articles?
The FederatedPassiveSignInStatus control (which should be part of VS if you've installed all the WIF stuff) will help you. Add it to your app. and clicking it will log you out of everything.
Also AD FS: How to Invoke a WS-Federation Sign-Out
Add wfresh=0 as a URL parameter.
This parameter indicates "freshness requirements".
According to the spec:
If specified, this indicates the desired maximum age of authentication specified in minutes.