Используя одну базу данных Asp.net Membership с несколькими приложениями Единая точка входа

У меня есть два приложения asp.net на одном сервере IIS, и я хотел бы использовать тот же бэкэнд asp_security поставщик членства и база данных. Я считал, что все, что я должен сделать, является ссылкой то же имя приложения в обеих веб-конфигурациях, как я делаю теперь, но я должен делать что-то не так

В каждом приложения web.config у меня есть этот раздел.

<membership>
  <providers>
    <clear/>
    <add name="AspNetSqlMembershipProvider"
              type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
              connectionStringName="membership"
              enablePasswordRetrieval="false"
              enablePasswordReset="true"
              requiresQuestionAndAnswer="false"
              applicationName="/"
              requiresUniqueEmail="false"
              minRequiredPasswordLength="5"
              minRequiredNonalphanumericCharacters="0"
              passwordFormat="Hashed"
              maxInvalidPasswordAttempts="5"
              passwordAttemptWindow="10"
              passwordStrengthRegularExpression=""
              />
  </providers>
</membership>

Когда я вхожу в систему из приложения A, и обзор к приложению B приложения B, кажется, ничего не знает обо мне или моих учетных данных из приложения A. У кого-либо есть какие-либо идеи, что я делаю неправильно?

20
задан jim 29 October 2010 в 23:42
поделиться

2 ответа

В заключение я отвечу, как я достиг цели, о которой хотел спросить мой первоначальный вопрос.

У меня было два приложения asp.net на одном сервере IIS. Моей целью было сделать так, чтобы при входе пользователя в приложение 1 его учетные данные были доступны в приложении 2. Настройка поставщика членства asp.net - это только один шаг из того, что я искал. Даже если бы оба приложения использовали одну и ту же серверную базу данных и одну и ту же серверную базу данных, я все равно не прошел бы аутентификацию, когда нажал на app2. Я искал решение для единого входа.

После того, как оба приложения указывают на вашу базу данных asp_membership, поместив следующее в раздел system.web вашей веб-конфигурации

<authentication mode="Forms" />
<membership>
  <providers>
    <clear/>
    <add name="AspNetSqlMembershipProvider"
              type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
              connectionStringName="membership"
              applicationName="/"
              />
  </providers>
</membership>
<roleManager enabled="true" />

, убедитесь, что у обоих установлено одинаковое свойство applicationname.

Я использовал IIS 6, поэтому я настроил его на автоматическое создание машинного ключа для обоих приложений. Поскольку оба этих приложения находятся на одном компьютере, ключ будет идентичным, это критически важная часть для обеспечения работы единого входа. После установки IIS в мой web.config

    <machineKey decryptionKey="AutoGenerate" validation="SHA1" validationKey="AutoGenerate" />

было добавлено следующее. Вот и все. Как только это будет сделано, я смогу войти в app1, а затем перейти в app2 и сохранить свои учетные данные.

Спасибо за толчок в правильном направлении.

21
ответ дан 30 November 2019 в 01:02
поделиться

Я думаю, что лучшим решением было бы сделать метод А виртуальным, а не иметь B-повторную реализацию, к которой присоединен интерфейс А (это может потребовать больше работы, чем просто переопределение одной функции), что вы можете сделать так (пример должен быть полным, кроме определения загрузочного интерфейса):

#include <glib-object.h>
#include "fooable.h"

typedef struct {GObject parent;} A;
typedef struct {
    GObjectClass parent;
    gint (*foo) (Fooable *self, gdouble quux);
} AClass;

#define TYPE_A           (a_get_type())
#define A_CLASS(cls)     (G_TYPE_CHECK_CLASS_CAST((cls), TYPE_A, AClass))
#define A_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), TYPE_A, AClass))

gint a_foo_real (Fooable *self, gdouble quux) {
    g_print("a_foo_real(%g)\n", quux);
    return 5;
}

gint a_foo (Fooable *self, gdouble quux) {
    return A_GET_CLASS(self)->foo(self, quux);
}

void implement_fooable (FooableIface *iface) {iface->foo = a_foo;}
void a_class_init      (AClass *cls)         {cls->foo = a_foo_real;}
void a_init            (A *self)             {}

G_DEFINE_TYPE_WITH_CODE(A, a, G_TYPE_OBJECT,
    G_IMPLEMENT_INTERFACE(TYPE_FOOABLE, implement_fooable));

/* derive class B from A  */
typedef struct {A parent;} B;
typedef struct {AClass parent;} BClass;

#define TYPE_B (b_get_type())

gint b_foo_real (Fooable *self, gdouble quux) {
    g_print("b_foo_real(%g)\n", quux);
    return 55;
}

void b_class_init (BClass *cls) {A_CLASS(cls)->foo = b_foo_real;}
void b_init       (B *self)     {}

G_DEFINE_TYPE(B, b, TYPE_A);

int main () {
    g_type_init();
    A *a = g_object_new(TYPE_A, NULL);
    B *b = g_object_new(TYPE_B, NULL);
    fooable_foo(FOOABLE(a), 87.0); // a_foo_real(87.0) and returns 5
    fooable_foo(FOOABLE(b), 32.0); // b_foo_real(32.0) and returns 55
    return 0;
}

Это так же кратко, как я могу сделать это. При вызове fooable _ foo () функция просматривает свою таблицу vtable для функции, определенной при реализации интерфейса a _ foo () , которая просматривает таблицу vtable класса A, чтобы определить, какую функцию следует фактически вызвать. Определение класса B переопределяет класс A a _ foo _ real () своим собственным. Если для цепочки требуется b _ foo _ real класса B, это достаточно просто (используйте A _ CLASS (b_parent_class) - > foo () , который определен для вас в макросе G_DEFINE_TYPE)

-121--4781092-

В приложении блога запись является сущностью, а тэг - объектом значения. У тэг нет удостоверения личности. Необходимо иметь:

  • Репозиторий
  • Проводка (сущность)
  • Тэгов (объект значения)

Проводка получила список тэгов.

Вопросы:

1: Я также прочитал, что не рекомендуется, чтобы доменная сущность общалась с доменной службой. Это правда?

Да, это не хорошая практика. Вы сущность не хотите связываться с доменной службой. Если вы сделаете это, вы не сможете использовать их позже. Вам пришлось рассмотреть возможность запуска события домена. Вы можете сказать своей области обслуживания сделать что-то fire доменных событий.

2.: Можно ли получить ссылку на доменную службу PostServices с помощью метода создания фабрики. например, IPostService PostService = ServiceUtil.GetPostService (); return PostService.GetTags (Post.content);

Да, это возможно. Заводской метод может возвращать абстрактный класс или интерфейс. Это хороший принцип разработки программного обеспечения «код для интерфейса, а не для реализации». Если вы это сделаете, вы сможете изменить свою реализацию позже, и вам не придется менять код вашего клиента.

3: Допустимо ли подключение доменной службы к API третьей стороны?

Я не рекомендую вам это, но это допустимо.

Извините, я не понимаю вопрос 4.

Посмотрите эту ссылку. Надеюсь, это поможет тебе.

https://stackoverflow.com/questions/901462/ddd-where-is-it-most-appropriate-to-get-a-list-of-value-objects/901562#901562

-121--4055796-

Если мое понимание верно, учетные данные аутентификации пользователей хранятся в контексте HTTP каждого приложения. Таким образом, переключение между двумя приложениями не будет автоматически аутентифицировать пользователя, так как новый контекст будет создан при переключении в приложение B.

Я полагаю, что правильным подходом будет использование DefureCredentials (или Свойство UseDefureCredentials с значением True ) текущего пользователя перед переключением в приложение B.

Если вы говорите «переключить», что вы имеете в виду, например.открыть другое окно браузера и получить доступ к приложению B или запросить страницу из приложения B из приложения A?

2
ответ дан 30 November 2019 в 01:02
поделиться
Другие вопросы по тегам:

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