Mohammad Shahbaz
Mohammad Shahbaz

Reputation: 423

SAML / Shibb authentication in Django

I am newbie to Django, but I know how to create a simple application in python-Django how to add new page , how to link it into url file etc.

Now what I am trying to do, I am trying to create a very simple webapp where On the landing page I will have a login link.

When the user clicks on this link it should go to george washington universities authentication window and then I can enter my university's credential and it should authenticate and come back to a page stating ** Login Successful**

I have gone through many tutorials, but all looks very confusing.

I have installed xmlsec1, pysaml2, djangosaml2 modules but even after that I was clueless what to do next. I never felt so much clueless like I am feeling for this authentication module.

It will be great if anyone can guide me with the process.

Upvotes: 3

Views: 1386

Answers (1)

Jim Culbert
Jim Culbert

Reputation: 21

You didn't say what web server you were using but, on Apache, I'd recommend you use the mod_shib Apache module in conjunction with the Django authentication middleware.

In broad strokes, you are going to let Apache/mod_shib do the SAML heavy lifting and interact with the IdP and you are going to let Django manage users for you. You are going to connect the two by using a piece of Django authentication middleware that authenticates users using the REMOTE_USER environment variable to communicate between Apache and the Django app.

So, first setup Django using Django authentication as described in the Django documentation. Validate that you can create a user using the admin tools and that you can login and establish a session using the Django authentication methods.

Once you have simple, local login working, install the RemoteUser middleware and validate that, by setting the REMOTE_USER environment variable, you can cause your Django app to log a user in (you can do all this testing using the development server locally on your development machine).

Once you have demonstrated that you can log a user in by having the REMOTE_USER environment set, you need to install the Apache shibboleth module, mod_shib and use it to protect the root of your application.

Assuming your application is located at /mysite the config in your virtualhost section would include:

<Location /mysite>
    ShibRequestSetting redirectToSSL 443
    AuthType shibboleth
    ShibRequestSetting requireSession 1
    Require valid-user
</Location>

That configuration will tell apache that the /mysite path requires mod_shib to get involved and forces the communication over ssl/tls.

I will not go through all the configuration steps needed to install and configure shibboleth but, basically, you want to set your application default (shibboleth2.xml file) with REMOTE_USER=eppn (if you want to use another attribute like eptid you would specify that); this tells the module which attribute to stuff in the REMOTE_USER environment variable. Again, the shib doc is pretty clear here so I won't go into detail about how to redirect to your university IdP but, basically, you will create an entry in your Sessions section of the form:

<SSO entityID="https://idp.testshib.org/idp/shibboleth">

Where you would substitute your IdP location for the testshib URL shown above.

Note that we are setting REMOTE_USER to the eppn value and that that value will be interpreted by the Django auth middleware as the user's username; you will need to create Django users with usernames that are the same as their eppn for this to work. You can also allow Django to auto-provision new accounts if, for instance, you deem IdP authentication sufficient evidence to create a new user account but, with auto-provisioning, only the minimal bits get setup; you would still need to go into that account and set first name, last name, phone, etc.

The net effect is that, whenever an unauthenticated user tries to visit a location under /mysite, they will be redirected to your university IdP, they will logon there and be redirected back. The mod_shib module (in conjunction with the shibd daemon running in the background) will handle the attribute unpacking and the session state with the IdP and will set the eppn value in the REMOTE _USER environment variable. Assuming that your Django application was setup correctly with apache, it will be invoked and the RemoteUser middleware will use the eppn value set in the REMOTE_USER environment variable to lookup the user with that username in the authentication database. If it finds a user, it will complete the Django login process (i.e. set the user object in the request, set the session state, etc.)

One more thing. To talk to you university IdP and have it release attributes to your application (i.e. eppn), you will need to do three things:

  1. Import their IdP metadata
  2. Export your SP metadata and have your university identity folks import it
  3. Get your university identity team to release eppn to you

Just be aware that those three steps can be a challenge and may take non-trivial time and homework.

One more one more thing: I would recommend verifying the SAML setup separate from your Django app/middleware integration. Using the simplest mechanism you are comfortable with (simple wsgi app, php script, whatever) create a page that will simply dump the REMOTE_USER environment variable when browsed then protect that first. Once you have that page redirecting to your IdP and dumping the correct eppn in REMOTE_USER on return, then you can move on to the Django bits.

Upvotes: 2

Related Questions