Я хотел бы остановиться на конкретном аспекте этого вопроса, как показано в этом комментарии:
OAuth: перед предоставлением доступа к какой-либо функции необходимо выполнить аутентификацию, верно? поэтому OAuth = что OpenId делает + предоставляет доступ к некоторым функциям? - Хасан Макаров 21 июня в 1:57
Да ... и нет. Ответ тонкий, поэтому терпите меня.
Когда поток OAuth перенаправляет вас к целевой службе (то есть провайдеру OAuth), вероятно вам потребуется пройти аутентификацию с этой службой, прежде чем токен будет возвращен клиентское приложение / сервис. Затем полученный токен позволяет клиентскому приложению отправлять запросы от имени данного пользователя.
Обратите внимание на общность этого последнего предложения: в частности, я написал «от имени данного пользователя», , а не »от имени вас ». Распространенной ошибкой является предположение, что «наличие возможности взаимодействовать с ресурсом, принадлежащим данному пользователю», подразумевает, что «вы и владелец целевого (ых) ресурса (ов) - одно и то же».
Не совершайте эту ошибку.
Хотя это правда, что вы аутентифицируетесь с провайдером OAuth (скажем, по имени пользователя и паролю, или, возможно, SSL-сертификатам клиента, или каким-либо другим способом), то, что клиент получает взамен, не обязательно должно быть . в качестве доказательства личности. Примером может служить поток, в котором доступ к ресурсам другого пользователя был делегирован вам (и через прокси-сервер, клиент OAuth). Авторизация не подразумевает аутентификацию.
Для обработки аутентификации вам, вероятно, захочется заглянуть в OpenID Connect, который, по сути, является еще одним уровнем поверх основы, установленной OAuth 2.0. Вот цитата, которая фиксирует (на мой взгляд) наиболее существенные моменты, касающиеся OpenID Connect (из https://oauth.net/articles/authentication/ ):
OpenID Connect это открытый стандарт, опубликованный в начале 2014 года, который определяет совместимый способ использования OAuth 2.0 для аутентификации пользователей. По сути, это широко опубликованный рецепт шоколадной помадки, который был опробован и испытан многими экспертами. Вместо того чтобы создавать разные протоколы для каждого потенциального поставщика удостоверений, приложение может общаться по одному протоколу с таким количеством поставщиков, с которыми они хотят работать. Поскольку OpenID Connect является открытым стандартом, он может быть реализован любым пользователем без каких-либо ограничений или проблем с интеллектуальной собственностью.
OpenID Connect построен непосредственно на OAuth 2.0 и в большинстве случаев разворачивается вместе с (или поверх) инфраструктурой OAuth. OpenID Connect также использует набор спецификаций JSONE для подписи и шифрования объектов (JOSE) для переноса подписанной и зашифрованной информации в разные места. Фактически, развертывание OAuth 2.0 с возможностями JOSE - это уже долгий путь к определению полностью совместимой системы OpenID Connect, и разница между ними относительно невелика. Но эта дельта имеет большое значение, и OpenID Connect удается избежать многих ловушек, обсужденных выше, добавив несколько ключевых компонентов в базу OAuth: [...]
Затем документ переходит к описать (среди прочего) идентификаторы токенов и конечную точку UserInfo. Первый предоставляет набор утверждений (кто вы, когда был выдан токен и т. Д., И, возможно, подпись для проверки подлинности токена с помощью опубликованного открытого ключа без необходимости запрашивать у вышестоящей службы 118) и последний обеспечивает средства, например, запрашивать имя / фамилию пользователя, адрес электронной почты и аналогичные фрагменты информации - все стандартизированным способом (в отличие от специальных расширений OAuth, которые люди использовали до стандартизированных вещей OpenID Connect).
В рамках инициализации каждого модуля вы можете добавить ресурсы приложения:
Application.Current.Resources.MergedDictionaries
.Add(new ResourceDictionary
{
Source = new Uri(
@"pack://application:,,,/MyApplication.Modules.Module1.Module1Init;component/Resources.xaml")
});
Или, если вы следуете соглашению, каждый модуль имеет словарь ресурсов под названием «Resources.xmal» ...
protected override IModuleCatalog GetModuleCatalog()
{
var catalog = new ModuleCatalog();
AddModules(catalog,
typeof (Module1),
typeof(Module2),
typeof(Module3),
typeof(Module4));
return catalog;
}
private static void AddModules(ModuleCatalog moduleCatalog,
params Type[] types)
{
types.ToList()
.ForEach(x =>
{
moduleCatalog.AddModule(x);
Application.Current.Resources.MergedDictionaries
.Add(new ResourceDictionary
{
Source = new Uri(string.Format(
@"pack://application:,,,/{0};component/{1}",
x.Assembly,
"Resources.xaml"))
});
});
}
Чтобы ваше приложение оболочки не знало ничего о ваших модулях, а ваши модули никаким образом не обращались к оболочке, я бы предоставил интерфейс для ваших модулей следующим образом:
IMergeDictionaryRegistry
{
void AddDictionaryResource(Uri packUri);
}
Вы бы запросили этот интерфейс в своем коде модуля:
public class MyModule : IModule
{
IMergeDictionaryRegistry _merger;
public MyModule(IMergeDictionaryRegistry merger)
{
_merger = merger;
}
public void Initialize()
{
_merger.AddDictionaryResource(new Uri("pack://application:,,,/Module1;component/Module1Resources.xaml");
}
}
Затем вы должны реализовать это в своей оболочке, чтобы сделать это:
public MergeDictionaryRegistry : IMergeDictionaryRegistry
{
public void AddDictionaryResource(Uri packUri)
{
Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary()
{
Source = packUri;
});
}
}
И, наконец, в ConfigureContainer вашего загрузчика:
public override void ConfigureContainer()
{
base.ConfigureContainer();
Container.RegisterType<IMergeDictionaryRegistry, MergeDictionaryRegistry>();
}
Это даст вам функциональность, которую вы хотите, чтобы и ваша оболочка и ваш модуль оставались независимыми друг от друга. Это дает дополнительное преимущество, заключающееся в том, что вам не нужно запускать приложение
для тестирования кода модуля (просто смоделируйте IMergeDictionaryRegistry
, и все готово).
Сообщите нам, как это пойдет для вас.