Click here to Skip to main content
6,295,667 members and growing! (13,046 online)
Email Password   helpLost your password?
Web Development » Web Security » Security     Intermediate

Single sign-on across multiple applications in ASP.NET

By Michal Altair Valasek

By default, Forms authentication does not support single sing-on accross multiple applications. But is not too complicated to tweak it the appropriate way.
VB, Windows, .NET 1.0, .NET 1.1, ASP.NET, Visual Studio, Dev
Posted:31 Mar 2004
Views:188,061
Bookmarked:113 times
Announcements
Loading...
 
Search    
Advanced Search
printPrint   Broken Article?Report       add Share
  Discuss Discuss   Recommend Article Email
31 votes for this article.
Popularity: 6.03 Rating: 4.05 out of 5
6 votes, 19.4%
1
1 vote, 3.2%
2
1 vote, 3.2%
3
8 votes, 25.8%
4
15 votes, 48.4%
5

Introduction

I prefer to use the Forms authentication for most of my applications. And most of my projects consist of a few relatively independent parts running on subdomains of the main domain. It would be nice to have single sign-on, so if you are logged on at www.example.com, you would be recognized also at everything.example.com.

Forms authentication by default does not support this feature, but is not too complicated to tweak it the appropriate way.

Behind the Forms authentication

Technology behind the Forms authentication is simple: it would create a cookie of defined name (attribute name of forms attribute in web.config). The cookie would contain encrypted authentication data.

To protect user's privacy and for security reasons, you can only read cookies that you wrote. They're associated with server hostname by default. But the cookie standard supports making cookies accessible for entire domain in which the server lies. It means that from server1.example.com, you can work with cookies for both server1.example.com and example.com.

You can set domain-wide cookie only for second level domain, or for third level domain if second level domain contains three or less characters. It means that you cannot set cookie for domain "com" or "co.uk", but can for "example.com" or "example.co.uk".

So, only what you need is to make authentication cookies domain-wide.

Setting it up

You must setup authentication in system.web section of your web.config file as usual, for example:

<authentication mode="Forms">
  <forms name=".EXAMPLE-AUTH" loginUrl="/Login.aspx" 
               protection="All" timeout="30" path="/" />
</authentication>

As I said before, the authentication cookie is encrypted. By default, encryption key is generated automatically. But if you need more servers to cooperate, you need to have the keys same on both servers. This can be done by adding the following to system.web section of web.config:

<machineKey
  validationKey="BD52058A3DEA473EA99F29418689528A494DF2B00054BB7C" 
  decryptionKey="684FC9301F404DE1B9565E7D952005579E823307BED44885" 
/>

The values of validation and decryption key should be 16 (for DES) or 48 (for TripleDES) characters long hexadecimal numbers.

Signing on

You must modify the authentication cookie before sending it to the client, by specifying your domain name. The code can be as follows (assumes that user has been authenticated and his name is stored in string variable UserName):

Dim C As System.Web.HttpCookie = _
         System.Web.Security.FormsAuthentication.GetAuthCookie(UserName, False)
C.Domain = "example.com"
Response.AppendCookie(C)
Response.Redirect(System.Web.Security.FormsAuthentication.GetRedirectUrl(UserName, 
                                                                           False))

Signing off

Usually, there is no need to make something special to sign the user off - just call System.Web.Security.FormsAuthentication.SignOut(). But not in this case - the SignOut() method is unable to deal with domain-wide cookies.

You need to delete the cookie manually. And the only way to delete a cookie is to set its expiration date to past. You may do it using the following code:

Dim C As System.Web.HttpCookie = _
         Request.Cookies(System.Web.Security.FormsAuthentication.FormsCookieName)
C.Domain = "example.com"
C.Expires = DateTime.Now.AddDays(-1)
Response.Cookies.Add(C)

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Michal Altair Valasek


Member
Software developer, system administrator, web designer, journalist, fantasy writer, film editor and executive producer - some of occupations I held in 27 years of my age.

  • Awarded as Microsoft Most Valuable Professional (MVP) for ASP.NET technology.
  • Editor and publisher of ASPNET.CZ (formerly known as ASP Network), oldest Czech web server dedicated to Microsoft technology for the Internet.
  • Project coordinator of BDSM.CZ (http://www.bdsm.cz, first and biggest Czech non-commercial server about sadomasochism.

See my weblog (in Czech language) at http://weblog.rider.cz
Occupation: Web Developer
Location: Czech Republic Czech Republic

Other popular Web Security articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 25 of 53 (Total in Forum: 53) (Refresh)FirstPrevNext
GeneralCookies Across Domains Pinmembermohit23232:26 20 Apr '08  
GeneralFacing problem with Domain and subdomain PinmemberJavad Mehmood9:37 26 Dec '07  
GeneralRe: Facing problem with Domain and subdomain PinmemberPranjaliBhide4:18 13 Aug '08  
Generalon different domains? Pinmemberdagarwal8221:24 7 Nov '06  
GeneralLogging out not working. PinmemberNigel Liefrink 221:39 21 Aug '06  
GeneralProblem when is not persistant PinmemberLordfkiller10:11 15 Mar '06  
GeneralRe: Problem when is not persistant PinmemberLordfkiller2:35 16 Mar '06  
Questionlocalhost Pinmemberxgnitesh6:45 9 Feb '06  
AnswerRe: localhost Pinmemberdavidhart7:57 4 Sep '07  
QuestionRe: localhost PinmemberOfir-z6:37 1 Aug '08  
AnswerRe: localhost PinmemberOfir-z6:44 1 Aug '08  
GeneralTIcket pass Worked in ASP 1.1 but not in 2.0.. PinmemberPchao17:21 25 Dec '05  
GeneralRe: TIcket pass Worked in ASP 1.1 but not in 2.0.. Pinmembermrbikejoc15:52 7 Feb '08  
GeneralPls highlight the importance of <machineKey> PinsussAnonymous10:17 20 Oct '05  
GeneralCannot logout PinmemberJong-Hyun12:06 9 May '05  
GeneralJOSSO Single Sign-On supports ASP PinsussAnonymous3:50 8 Mar '05  
GeneralRe: JOSSO Single Sign-On supports ASP Pinmemberayurhdfkl1:02 1 Aug '07  
Generaliframe and form authentication? Pinmembernorm21:08 18 Feb '05  
GeneralSingle sign on within sub domain PinsussGurumoorthi Kumar19:09 2 Jan '05  
GeneralRe: Single sign on within sub domain PinmemberDevDude12:35 26 Jan '06  
GeneralA better way PinsussAnonymous9:39 23 Dec '04  
GeneralRe: A better way PinmemberMichal Altair Valasek10:54 23 Dec '04  
GeneralSSO Across Domains PinsussChecking10:31 14 Oct '04  
GeneralRe: SSO Across Domains PinmemberMichal Altair Valasek13:39 14 Oct '04  
GeneralASP Pinmembermatzy8:01 24 Sep '04  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 31 Mar 2004
Editor: Smitha Vijayan
Copyright 2004 by Michal Altair Valasek
Everything else Copyright © CodeProject, 1999-2009
Web11 | Advertise on the Code Project