[corlib] Assume UTC if no $TZ set. Fixes #30360
[mono.git] / mcs / class / System.IdentityModel / System.IdentityModel.Selectors / CustomUserNameSecurityTokenAuthenticator.cs
1 //
2 // CustomUserNameSecurityTokenAuthenticator.cs
3 //
4 // Author:
5 //      Atsushi Enomoto <atsushi@ximian.com>
6 //
7 // Copyright (C) 2006 Novell, Inc.  http://www.novell.com
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 // 
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 // 
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28 using System;
29 using System.Collections.Generic;
30 using System.Collections.ObjectModel;
31 using System.IdentityModel.Claims;
32 using System.IdentityModel.Policy;
33 using System.IdentityModel.Tokens;
34 using System.Security.Principal;
35 using System.Xml;
36
37 namespace System.IdentityModel.Selectors
38 {
39         public class CustomUserNameSecurityTokenAuthenticator
40                 : UserNameSecurityTokenAuthenticator
41         {
42                 UserNamePasswordValidator validator;
43
44                 public CustomUserNameSecurityTokenAuthenticator (
45                         UserNamePasswordValidator validator)
46                 {
47                         if (validator == null)
48                                 throw new ArgumentNullException ("validator");
49                         this.validator = validator;
50                 }
51
52                 protected override ReadOnlyCollection<IAuthorizationPolicy>
53                         ValidateUserNamePasswordCore (string userName, string password)
54                 {
55                         validator.Validate (userName, password);
56                         IAuthorizationPolicy policy =
57                                 new AuthorizedCustomUserPolicy (userName);
58                         return new ReadOnlyCollection<IAuthorizationPolicy> (new IAuthorizationPolicy [] {policy});
59                 }
60
61                 abstract class SystemIdentityAuthorizationPolicy : IAuthorizationPolicy
62                 {
63                         string id;
64
65                         protected SystemIdentityAuthorizationPolicy (string id)
66                         {
67                                 this.id = id;
68                         }
69
70                         public string Id {
71                                 get { return id; }
72                         }
73
74                         public ClaimSet Issuer {
75                                 get { return ClaimSet.System; }
76                         }
77
78
79                         // This method is expected to be thread safe
80                         public bool Evaluate (EvaluationContext ec, ref object state)
81                         {
82                                 lock (ec) {
83                                         ec.AddClaimSet (this, CreateClaims ());
84                                         List<IIdentity> list;
85                                         if (!ec.Properties.ContainsKey ("Identities")) {
86                                                 list = new List<IIdentity> ();
87                                                 ec.Properties ["Identities"] = list;
88                                         } else {
89                                                 IList<IIdentity> ilist = (IList<IIdentity>) ec.Properties ["Identities"];
90                                                 list = ilist as List<IIdentity>;
91                                                 if (list == null) {
92                                                         list = new List<IIdentity> (ilist);
93                                                         ec.Properties ["Identities"] = list;
94                                                 }
95                                         }
96                                         list.Add (CreateIdentity ());
97                                         ec.RecordExpirationTime (DateTime.MaxValue.AddDays (-1));
98                                 }
99                                 // FIXME: is it correct that this should always return true?
100                                 return true;
101                         }
102
103                         public abstract DateTime ExpirationTime { get; }
104
105                         public abstract ClaimSet CreateClaims ();
106
107                         public abstract IIdentity CreateIdentity ();
108                 }
109
110                 class AuthorizedCustomUserPolicy : SystemIdentityAuthorizationPolicy
111                 {
112                         string user;
113
114                         public AuthorizedCustomUserPolicy (string user)
115                                 : base (new UniqueId ().ToString ())
116                         {
117                                 this.user = user;
118                         }
119
120                         public override DateTime ExpirationTime {
121                                 get { return DateTime.MaxValue; }
122                         }
123
124                         public override ClaimSet CreateClaims ()
125                         {
126                                 return new DefaultClaimSet (Claim.CreateNameClaim (user));
127                         }
128
129                         public override IIdentity CreateIdentity ()
130                         {
131                                 return new GenericIdentity (user);
132                         }
133                 }
134         }
135 }