mirror of https://github.com/abpframework/abp.git
1 changed files with 74 additions and 0 deletions
@ -0,0 +1,74 @@ |
|||||
|
# Custom SignIn Manager |
||||
|
|
||||
|
ABP Framework uses Microsoft Identity underneath hence supports customization as much as Microsoft Identity does. |
||||
|
|
||||
|
### Creating CustomSignInManager |
||||
|
|
||||
|
To create your own custom SignIn Manager, you need to inherit `SignInManager<Volo.Abp.Identity.IdentityUser>`. |
||||
|
|
||||
|
````xml |
||||
|
public class CustomSignInManager : SignInManager<Volo.Abp.Identity.IdentityUser> |
||||
|
{ |
||||
|
public CustomSigninManager( |
||||
|
UserManager<Volo.Abp.Identity.IdentityUser> userManager, |
||||
|
IHttpContextAccessor contextAccessor, |
||||
|
IUserClaimsPrincipalFactory<Volo.Abp.Identity.IdentityUser> claimsFactory, |
||||
|
IOptions<IdentityOptions> optionsAccessor, |
||||
|
ILogger<SignInManager<Volo.Abp.Identity.IdentityUser>> logger, |
||||
|
IAuthenticationSchemeProvider schemes, |
||||
|
IUserConfirmation<Volo.Abp.Identity.IdentityUser> confirmation) |
||||
|
: base(userManager, contextAccessor, claimsFactory, optionsAccessor, logger, schemes, confirmation) |
||||
|
{ |
||||
|
} |
||||
|
} |
||||
|
```` |
||||
|
|
||||
|
### Overriding Methods |
||||
|
|
||||
|
Afterwards you can override a method like `GetExternalLoginInfoAsync`: |
||||
|
|
||||
|
````xml |
||||
|
public override async Task<ExternalLoginInfo> GetExternalLoginInfoAsync(string expectedXsrf = null) |
||||
|
{ |
||||
|
var auth = await Context.AuthenticateAsync(IdentityConstants.ExternalScheme); |
||||
|
var items = auth?.Properties?.Items; |
||||
|
if (auth?.Principal == null || items == null || !items.ContainsKey("LoginProvider")) |
||||
|
{ |
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
if (expectedXsrf != null) |
||||
|
{ |
||||
|
if (!items.ContainsKey("XsrfId")) |
||||
|
{ |
||||
|
return null; |
||||
|
} |
||||
|
var userId = items[XsrfKey] as string; |
||||
|
if (userId != expectedXsrf) |
||||
|
{ |
||||
|
return null; |
||||
|
} |
||||
|
var providerKey = auth.Principal.FindFirstValue(ClaimTypes.NameIdentifier); |
||||
|
var provider = items[LoginProviderKey] as string; |
||||
|
if (providerKey == null || provider == null) |
||||
|
{ |
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
var providerDisplayName = (await GetExternalAuthenticationSchemesAsync()).FirstOrDefault(p => p.Name == provider)?.DisplayName ?? provider; |
||||
|
return new ExternalLoginInfo(auth.Principal, provider, providerKey, providerDisplayName) |
||||
|
{ |
||||
|
AuthenticationTokens = auth.Properties.GetTokens() |
||||
|
}; |
||||
|
} |
||||
|
```` |
||||
|
|
||||
|
### Registering to DI |
||||
|
|
||||
|
You need to register your Custom SignIn Manager to DI to activate it. Inside the `.Web` project, locate the `ApplicationNameWebModule` add the following under `ConfigureServices` method: |
||||
|
|
||||
|
````xml |
||||
|
context.Services |
||||
|
.GetObject<IdentityBuilder>() |
||||
|
.AddSignInManager<CustomSigninManager>(); |
||||
|
```` |
||||
Loading…
Reference in new issue