Составьте WPF (Призма) шаблоны данных ресурсов модуля

Я хотел бы остановиться на конкретном аспекте этого вопроса, как показано в этом комментарии:

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).

14
задан Oll 23 July 2009 в 19:23
поделиться

2 ответа

В рамках инициализации каждого модуля вы можете добавить ресурсы приложения:

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"))
                              });
              });
}
6
ответ дан 1 December 2019 в 09:13
поделиться

Чтобы ваше приложение оболочки не знало ничего о ваших модулях, а ваши модули никаким образом не обращались к оболочке, я бы предоставил интерфейс для ваших модулей следующим образом:

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 , и все готово).

Сообщите нам, как это пойдет для вас.

21
ответ дан 1 December 2019 в 09:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: