1717using Abp . Timing ;
1818using Abp . UI ;
1919using Abp . Web . Models ;
20- using Abp . Zero . AspNetCore ;
2120using Abp . Zero . Configuration ;
2221using Microsoft . AspNetCore . Mvc ;
2322using AbpCompanyName . AbpProjectName . Authorization ;
2423using AbpCompanyName . AbpProjectName . MultiTenancy ;
2524using AbpCompanyName . AbpProjectName . Web . Models . Account ;
2625using AbpCompanyName . AbpProjectName . Authorization . Users ;
2726using AbpCompanyName . AbpProjectName . Controllers ;
27+ using AbpCompanyName . AbpProjectName . Identity ;
2828using AbpCompanyName . AbpProjectName . Sessions ;
29- using AbpCompanyName . AbpProjectName . Web . Identity ;
3029using AbpCompanyName . AbpProjectName . Web . Startup ;
3130using AbpCompanyName . AbpProjectName . Web . Views . Shared . Components . TenantChange ;
32- using Microsoft . AspNet . Identity ;
31+ using Microsoft . AspNetCore . Identity ;
3332
3433namespace AbpCompanyName . AbpProjectName . Web . Controllers
3534{
@@ -94,39 +93,26 @@ public ActionResult Login(string userNameOrEmailAddress = "", string returnUrl =
9493 [ UnitOfWork ]
9594 public virtual async Task < JsonResult > Login ( LoginViewModel loginModel , string returnUrl = "" , string returnUrlHash = "" )
9695 {
97- var loginResult = await GetLoginResultAsync ( loginModel . UsernameOrEmailAddress , loginModel . Password , GetTenancyNameOrNull ( ) ) ;
98-
99- await SignInAsync ( loginResult . User , loginResult . Identity , loginModel . RememberMe ) ;
100- await UnitOfWorkManager . Current . SaveChangesAsync ( ) ;
101-
102- if ( string . IsNullOrWhiteSpace ( returnUrl ) )
103- {
104- returnUrl = GetAppHomeUrl ( ) ;
105- }
106-
96+ returnUrl = NormalizeReturnUrl ( returnUrl ) ;
10797 if ( ! string . IsNullOrWhiteSpace ( returnUrlHash ) )
10898 {
10999 returnUrl = returnUrl + returnUrlHash ;
110100 }
111101
102+ var loginResult = await GetLoginResultAsync ( loginModel . UsernameOrEmailAddress , loginModel . Password , GetTenancyNameOrNull ( ) ) ;
103+
104+ await _signInManager . SignInAsync ( loginResult . Identity , loginModel . RememberMe ) ;
105+ await UnitOfWorkManager . Current . SaveChangesAsync ( ) ;
106+
112107 return Json ( new AjaxResponse { TargetUrl = returnUrl } ) ;
113108 }
114109
115110 public async Task < ActionResult > Logout ( )
116111 {
117- await HttpContext . Authentication . SignOutAsync ( AuthConfigurer . AuthenticationScheme ) ;
112+ await _signInManager . SignOutAsync ( ) ;
118113 return RedirectToAction ( "Login" ) ;
119114 }
120115
121- private async Task SignInAsync ( User user , ClaimsIdentity identity = null , bool rememberMe = false )
122- {
123- if ( identity == null )
124- {
125- identity = await _userManager . CreateIdentityAsync ( user , AuthConfigurer . AuthenticationScheme ) ;
126- }
127-
128- await _signInManager . SignOutAllAndSignInAsync ( identity , rememberMe ) ;
129- }
130116
131117 private async Task < AbpLoginResult < Tenant , User > > GetLoginResultAsync ( string usernameOrEmailAddress , string password , string tenancyName )
132118 {
@@ -173,10 +159,10 @@ public async Task<ActionResult> Register(RegisterViewModel model)
173159 {
174160 try
175161 {
176- ExternalLoginUserInfo externalLoginInfo = null ;
162+ ExternalLoginInfo externalLoginInfo = null ;
177163 if ( model . IsExternalLogin )
178164 {
179- externalLoginInfo = await _signInManager . GetExternalLoginUserInfo ( model . ExternalLoginAuthSchema ) ;
165+ externalLoginInfo = await _signInManager . GetExternalLoginInfoAsync ( ) ;
180166 if ( externalLoginInfo == null )
181167 {
182168 throw new ApplicationException ( "Can not external login!" ) ;
@@ -208,8 +194,8 @@ public async Task<ActionResult> Register(RegisterViewModel model)
208194 if ( model . IsExternalLogin )
209195 {
210196 Debug . Assert ( externalLoginInfo != null ) ;
211-
212- if ( string . Equals ( externalLoginInfo . EmailAddress , model . EmailAddress , StringComparison . InvariantCultureIgnoreCase ) )
197+
198+ if ( string . Equals ( externalLoginInfo . Principal . FindFirstValue ( ClaimTypes . Email ) , model . EmailAddress , StringComparison . OrdinalIgnoreCase ) )
213199 {
214200 user . IsEmailConfirmed = true ;
215201 }
@@ -218,8 +204,8 @@ public async Task<ActionResult> Register(RegisterViewModel model)
218204 {
219205 new UserLogin
220206 {
221- LoginProvider = externalLoginInfo . LoginInfo . LoginProvider ,
222- ProviderKey = externalLoginInfo . LoginInfo . ProviderKey ,
207+ LoginProvider = externalLoginInfo . LoginProvider ,
208+ ProviderKey = externalLoginInfo . ProviderKey ,
223209 TenantId = user . TenantId
224210 }
225211 } ;
@@ -237,7 +223,7 @@ public async Task<ActionResult> Register(RegisterViewModel model)
237223 AbpLoginResult < Tenant , User > loginResult ;
238224 if ( externalLoginInfo != null )
239225 {
240- loginResult = await _logInManager . LoginAsync ( externalLoginInfo . LoginInfo , tenant . TenancyName ) ;
226+ loginResult = await _logInManager . LoginAsync ( externalLoginInfo , tenant . TenancyName ) ;
241227 }
242228 else
243229 {
@@ -246,7 +232,7 @@ public async Task<ActionResult> Register(RegisterViewModel model)
246232
247233 if ( loginResult . Result == AbpLoginResultType . Success )
248234 {
249- await SignInAsync ( loginResult . User , loginResult . Identity ) ;
235+ await _signInManager . SignInAsync ( loginResult . Identity , false ) ;
250236 return Redirect ( GetAppHomeUrl ( ) ) ;
251237 }
252238
@@ -300,60 +286,60 @@ public ActionResult ExternalLogin(string provider, string returnUrl)
300286 [ UnitOfWork ]
301287 public virtual async Task < ActionResult > ExternalLoginCallback ( string returnUrl , string authSchema , string remoteError = null )
302288 {
289+ returnUrl = NormalizeReturnUrl ( returnUrl ) ;
290+
303291 if ( remoteError != null )
304292 {
305293 Logger . Error ( "Remote Error in ExternalLoginCallback: " + remoteError ) ;
306294 throw new UserFriendlyException ( L ( "CouldNotCompleteLoginOperation" ) ) ;
307295 }
308296
309- var tenancyName = GetTenancyNameOrNull ( ) ;
310-
311- var userInfo = await _signInManager . GetExternalLoginUserInfo ( authSchema ) ;
312-
313- if ( userInfo . LoginInfo == null || userInfo . LoginInfo . LoginProvider . IsNullOrEmpty ( ) || userInfo . LoginInfo . ProviderKey . IsNullOrEmpty ( ) )
297+ var externalLoginInfo = await _signInManager . GetExternalLoginInfoAsync ( authSchema ) ;
298+ if ( externalLoginInfo == null )
314299 {
315- Logger . Warn ( "Could not get LoginProvider and ProviderKey from external login." ) ;
316- return RedirectToAction ( " Login" ) ;
300+ Logger . Warn ( "Could not get information from external login." ) ;
301+ return RedirectToAction ( nameof ( Login ) ) ;
317302 }
318303
319- await HttpContext . Authentication . SignOutAsync ( AuthConfigurer . ExternalAuthenticationScheme ) ;
304+ await _signInManager . SignOutAsync ( ) ;
305+
306+ var tenancyName = GetTenancyNameOrNull ( ) ;
320307
321- var loginResult = await _logInManager . LoginAsync ( userInfo . LoginInfo , tenancyName ) ;
308+ var loginResult = await _logInManager . LoginAsync ( externalLoginInfo , tenancyName ) ;
322309
323310 switch ( loginResult . Result )
324311 {
325312 case AbpLoginResultType . Success :
326- await SignInAsync ( loginResult . User , loginResult . Identity , true ) ;
327-
328- if ( string . IsNullOrWhiteSpace ( returnUrl ) )
329- {
330- returnUrl = GetAppHomeUrl ( ) ;
331- }
332-
313+ await _signInManager . SignInAsync ( loginResult . Identity , false ) ;
333314 return Redirect ( returnUrl ) ;
334315 case AbpLoginResultType . UnknownExternalLogin :
335- return await RegisterForExternalLogin ( userInfo ) ;
316+ return await RegisterForExternalLogin ( externalLoginInfo ) ;
336317 default :
337318 throw _abpLoginResultTypeHelper . CreateExceptionForFailedLoginAttempt (
338319 loginResult . Result ,
339- userInfo . EmailAddress ?? userInfo . LoginInfo . ProviderKey ,
320+ externalLoginInfo . Principal . FindFirstValue ( ClaimTypes . Email ) ?? externalLoginInfo . ProviderKey ,
340321 tenancyName
341322 ) ;
342323 }
343324 }
344325
345- private async Task < ActionResult > RegisterForExternalLogin ( ExternalLoginUserInfo userInfo )
326+ private async Task < ActionResult > RegisterForExternalLogin ( ExternalLoginInfo externalLoginInfo )
346327 {
328+ var email = externalLoginInfo . Principal . FindFirstValue ( ClaimTypes . Email ) ;
329+ var nameinfo = ExternalLoginInfoHelper . GetNameAndSurnameFromClaims ( externalLoginInfo . Principal . Claims . ToList ( ) ) ;
330+
347331 var viewModel = new RegisterViewModel
348332 {
349- EmailAddress = userInfo . EmailAddress ,
350- Name = userInfo . Name ,
351- Surname = userInfo . Surname ,
333+ EmailAddress = email ,
334+ Name = nameinfo . name ,
335+ Surname = nameinfo . surname ,
352336 IsExternalLogin = true ,
353- ExternalLoginAuthSchema = userInfo . LoginInfo . LoginProvider
337+ ExternalLoginAuthSchema = externalLoginInfo . LoginProvider
354338 } ;
355339
356- if ( userInfo . HasAllNonEmpty ( ) )
340+ if ( nameinfo . name != null &&
341+ nameinfo . surname != null &&
342+ email != null )
357343 {
358344 return await Register ( viewModel ) ;
359345 }
@@ -417,6 +403,26 @@ private string GetTenancyNameOrNull()
417403 return _tenantCache . GetOrNull ( AbpSession . TenantId . Value ) ? . TenancyName ;
418404 }
419405
406+ private string NormalizeReturnUrl ( string returnUrl , Func < string > defaultValueBuilder = null )
407+ {
408+ if ( defaultValueBuilder == null )
409+ {
410+ defaultValueBuilder = GetAppHomeUrl ;
411+ }
412+
413+ if ( returnUrl . IsNullOrEmpty ( ) )
414+ {
415+ return defaultValueBuilder ( ) ;
416+ }
417+
418+ if ( Url . IsLocalUrl ( returnUrl ) )
419+ {
420+ return returnUrl ;
421+ }
422+
423+ return defaultValueBuilder ( ) ;
424+ }
425+
420426 #endregion
421427
422428 #region Etc
@@ -448,6 +454,5 @@ await _notificationPublisher.PublishAsync(
448454 }
449455
450456 #endregion
451-
452457 }
453458}
0 commit comments