@@ -35,7 +35,7 @@ public Callback(
35
35
_logger = logger ;
36
36
_events = events ;
37
37
}
38
-
38
+
39
39
public async Task < IActionResult > OnGet ( )
40
40
{
41
41
// read external identity from the temporary cookie
@@ -57,11 +57,32 @@ public async Task<IActionResult> OnGet()
57
57
// try to determine the unique id of the external user (issued by the provider)
58
58
// the most common claim type for that are the sub claim and the NameIdentifier
59
59
// depending on the external provider, some other claim type might be used
60
- var userIdClaim = externalUser . FindFirst ( JwtClaimTypes . Subject ) ??
61
- externalUser . FindFirst ( ClaimTypes . NameIdentifier ) ??
62
- throw new Exception ( "Unknown userid" ) ;
63
60
64
61
var provider = result . Properties . Items [ "scheme" ] ;
62
+
63
+ Claim userIdClaim = null ;
64
+
65
+ if ( provider == "AAD" )
66
+ {
67
+ userIdClaim = externalUser . FindFirst ( ClaimTypes . NameIdentifier ) ;
68
+ }
69
+ else if ( provider == "Microsoft" )
70
+ {
71
+ userIdClaim = externalUser . FindFirst ( ClaimTypes . NameIdentifier ) ;
72
+ }
73
+ else if ( provider == "Google" )
74
+ {
75
+ userIdClaim = externalUser . FindFirst ( ClaimTypes . NameIdentifier ) ;
76
+ }
77
+ else if ( provider == "Facebook" )
78
+ {
79
+ userIdClaim = externalUser . FindFirst ( ClaimTypes . NameIdentifier ) ;
80
+ }
81
+ else
82
+ {
83
+ userIdClaim = externalUser . FindFirst ( ClaimTypes . NameIdentifier ) ;
84
+ }
85
+
65
86
var providerUserId = userIdClaim . Value ;
66
87
67
88
// find external user
@@ -109,22 +130,35 @@ public async Task<IActionResult> OnGet()
109
130
110
131
private async Task < User > AutoProvisionUserAsync ( string provider , string providerUserId , IEnumerable < Claim > claims )
111
132
{
112
- var sub = Guid . NewGuid ( ) ;
113
-
114
- var user = new User
115
- {
116
- Id = sub ,
117
- UserName = sub . ToString ( ) , // don't need a username, since the user will be using an external provider to login
118
- } ;
119
-
120
133
// email
121
- var email = claims . FirstOrDefault ( x => x . Type == JwtClaimTypes . Email ) ? . Value ??
122
- claims . FirstOrDefault ( x => x . Type == ClaimTypes . Email ) ? . Value ;
123
- if ( email != null )
134
+ Claim emailClaim = null ;
135
+
136
+ if ( provider == "AAD" )
124
137
{
125
- user . Email = email ;
138
+ emailClaim = claims . FirstOrDefault ( x => x . Type == JwtClaimTypes . Email ) ??
139
+ claims . FirstOrDefault ( x => x . Type == ClaimTypes . Email ) ;
126
140
}
127
-
141
+ else if ( provider == "Microsoft" )
142
+ {
143
+ emailClaim = claims . FirstOrDefault ( x => x . Type == JwtClaimTypes . Email ) ??
144
+ claims . FirstOrDefault ( x => x . Type == ClaimTypes . Email ) ;
145
+ }
146
+ else if ( provider == "Google" )
147
+ {
148
+ emailClaim = claims . FirstOrDefault ( x => x . Type == JwtClaimTypes . Email ) ??
149
+ claims . FirstOrDefault ( x => x . Type == ClaimTypes . Email ) ;
150
+ }
151
+ else if ( provider == "Facebook" )
152
+ {
153
+ emailClaim = claims . FirstOrDefault ( x => x . Type == JwtClaimTypes . Email ) ??
154
+ claims . FirstOrDefault ( x => x . Type == ClaimTypes . Email ) ;
155
+ }
156
+ else
157
+ {
158
+ emailClaim = claims . FirstOrDefault ( x => x . Type == JwtClaimTypes . Email ) ??
159
+ claims . FirstOrDefault ( x => x . Type == ClaimTypes . Email ) ;
160
+ }
161
+
128
162
// create a list of claims that we want to transfer into our store
129
163
var filtered = new List < Claim > ( ) ;
130
164
@@ -155,17 +189,33 @@ private async Task<User> AutoProvisionUserAsync(string provider, string provider
155
189
}
156
190
}
157
191
158
- var identityResult = await _userManager . CreateAsync ( user ) ;
159
- if ( ! identityResult . Succeeded ) throw new Exception ( identityResult . Errors . First ( ) . Description ) ;
192
+ var userName = $ "{ provider } _{ providerUserId } ";
193
+
194
+ var user = await _userManager . FindByNameAsync ( userName ) ;
195
+
196
+ if ( user == null )
197
+ {
198
+ user = new User
199
+ {
200
+ UserName = userName ,
201
+ Email = emailClaim ? . Value ,
202
+ } ;
203
+
204
+ var createResult = await _userManager . CreateAsync ( user ) ;
205
+ if ( ! createResult . Succeeded )
206
+ {
207
+ throw new Exception ( createResult . Errors . First ( ) . Description ) ;
208
+ }
209
+ }
160
210
161
211
if ( filtered . Any ( ) )
162
212
{
163
- identityResult = await _userManager . AddClaimsAsync ( user , filtered ) ;
164
- if ( ! identityResult . Succeeded ) throw new Exception ( identityResult . Errors . First ( ) . Description ) ;
213
+ var addClaimResult = await _userManager . AddClaimsAsync ( user , filtered ) ;
214
+ if ( ! addClaimResult . Succeeded ) throw new Exception ( addClaimResult . Errors . First ( ) . Description ) ;
165
215
}
166
216
167
- identityResult = await _userManager . AddLoginAsync ( user , new UserLoginInfo ( provider , providerUserId , provider ) ) ;
168
- if ( ! identityResult . Succeeded ) throw new Exception ( identityResult . Errors . First ( ) . Description ) ;
217
+ var addLoginResult = await _userManager . AddLoginAsync ( user , new UserLoginInfo ( provider , providerUserId , provider ) ) ;
218
+ if ( ! addLoginResult . Succeeded ) throw new Exception ( addLoginResult . Errors . First ( ) . Description ) ;
169
219
170
220
return user ;
171
221
}
0 commit comments