2022-02-10 16:26:09 +00:00
|
|
|
namespace ASC.FederatedLogin.LoginProviders;
|
|
|
|
|
|
|
|
[Scope]
|
|
|
|
public class ProviderManager
|
2019-06-06 13:34:46 +00:00
|
|
|
{
|
2022-02-10 16:26:09 +00:00
|
|
|
public bool IsNotEmpty
|
2019-06-06 13:34:46 +00:00
|
|
|
{
|
2022-02-10 16:26:09 +00:00
|
|
|
get
|
2022-02-10 16:22:16 +00:00
|
|
|
{
|
2022-02-10 16:26:09 +00:00
|
|
|
return AuthProviders
|
|
|
|
.Select(GetLoginProvider)
|
|
|
|
.Any(loginProvider => loginProvider != null && loginProvider.IsEnabled);
|
2022-02-10 16:22:16 +00:00
|
|
|
}
|
2022-02-10 16:26:09 +00:00
|
|
|
}
|
2022-02-10 16:22:16 +00:00
|
|
|
|
2022-02-10 16:26:09 +00:00
|
|
|
public static readonly List<string> AuthProviders = new List<string>
|
2022-02-10 15:04:48 +00:00
|
|
|
{
|
|
|
|
ProviderConstants.Google,
|
|
|
|
ProviderConstants.Facebook,
|
|
|
|
ProviderConstants.Twitter,
|
|
|
|
ProviderConstants.LinkedIn,
|
|
|
|
ProviderConstants.MailRu,
|
|
|
|
ProviderConstants.VK,
|
|
|
|
ProviderConstants.Yandex,
|
|
|
|
ProviderConstants.GosUslugi
|
|
|
|
};
|
2020-07-28 08:13:49 +00:00
|
|
|
|
2022-02-10 16:26:09 +00:00
|
|
|
private readonly Signature _signature;
|
|
|
|
private readonly InstanceCrypto _instanceCrypto;
|
|
|
|
private readonly ConsumerFactory _consumerFactory;
|
2020-07-28 08:13:49 +00:00
|
|
|
|
2022-02-10 16:26:09 +00:00
|
|
|
public ProviderManager(Signature signature, InstanceCrypto instanceCrypto, ConsumerFactory consumerFactory)
|
|
|
|
{
|
|
|
|
_signature = signature;
|
|
|
|
_instanceCrypto = instanceCrypto;
|
|
|
|
_consumerFactory = consumerFactory;
|
|
|
|
}
|
2020-07-28 08:13:49 +00:00
|
|
|
|
2022-02-10 16:26:09 +00:00
|
|
|
public ILoginProvider GetLoginProvider(string providerType)
|
|
|
|
{
|
|
|
|
return providerType == ProviderConstants.OpenId
|
|
|
|
? new OpenIdLoginProvider(_signature, _instanceCrypto, _consumerFactory)
|
|
|
|
: _consumerFactory.GetByKey(providerType) as ILoginProvider;
|
|
|
|
}
|
|
|
|
|
|
|
|
public LoginProfile Process(string providerType, HttpContext context, IDictionary<string, string> @params, IDictionary<string, string> additionalStateArgs = null)
|
|
|
|
{
|
|
|
|
return GetLoginProvider(providerType).ProcessAuthoriztion(context, @params, additionalStateArgs);
|
|
|
|
}
|
|
|
|
|
|
|
|
public LoginProfile GetLoginProfile(string providerType, string accessToken)
|
|
|
|
{
|
|
|
|
var consumer = GetLoginProvider(providerType);
|
|
|
|
if (consumer == null)
|
2019-06-06 13:34:46 +00:00
|
|
|
{
|
2022-02-10 16:26:09 +00:00
|
|
|
throw new ArgumentException("Unknown provider type", nameof(providerType));
|
2019-06-06 13:34:46 +00:00
|
|
|
}
|
|
|
|
|
2022-02-10 16:26:09 +00:00
|
|
|
try
|
2019-06-06 13:34:46 +00:00
|
|
|
{
|
2022-02-10 16:26:09 +00:00
|
|
|
return consumer.GetLoginProfile(accessToken);
|
2019-06-06 13:34:46 +00:00
|
|
|
}
|
2022-02-10 16:26:09 +00:00
|
|
|
catch (Exception ex)
|
2019-06-06 13:34:46 +00:00
|
|
|
{
|
2022-02-10 16:26:09 +00:00
|
|
|
return LoginProfile.FromError(_signature, _instanceCrypto, ex);
|
2019-06-06 13:34:46 +00:00
|
|
|
}
|
2020-07-28 08:13:49 +00:00
|
|
|
}
|
2022-02-10 16:26:09 +00:00
|
|
|
}
|