Вызов Овина срабатывает во втором намерении на DNN

Я создал собственный модуль входа в систему для DNN со смешанной аутентификацией: 1) Аутентификация через ADFS. 2) Аутентификация с помощью обычной проверки подлинности форм. Все работает кроме:

protected void Adfs_Click(object sender, EventArgs e)
{
    HttpContext.Current.GetOwinContext()
                .Authentication.Challenge(new AuthenticationProperties { RedirectUri = redirectUrl },
                    OpenIdConnectAuthenticationDefaults.AuthenticationType);
}

первый клик перезагружает страницу и всегда срабатывает во второй раз. Я пытался отключить аутентификацию форм, например этот пост предлагает, но, поскольку я работаю с DNN, я не могу этого сделать.

Я также проверяю запуск события на Page_Load и работает, но я хочу, чтобы собственные пользователи DNN могли входить в систему напрямую в DNN (пользователь хоста) ... поэтому я тоже не могу выполнить задачу.

Любая помощь в том, что я должен сделать, чтобы задача работала с первого щелчка?

Заранее спасибо.


person lienysd    schedule 18.12.2014    source источник
comment
Вам когда-нибудь удавалось привести это в порядок?   -  person iiminov    schedule 24.02.2015
comment
Я не смог найти решение... если только я не позвоню из события Page_Load... Я закончил с совершенно другим решением...   -  person lienysd    schedule 25.02.2015
comment
Не могли бы вы поделиться несколькими идеями? Я столкнулся с проблемой, когда мой SignIn обгоняет DNN. Поэтому вместо этого меня перенаправляют на страницу входа в DNN.   -  person iiminov    schedule 26.02.2015
comment
Большой проблемой этого решения является несовместимость между аутентификацией форм, аутентификацией OWIN-OpenId и самой DNN. Чтобы вас не обогнали, вы должны поместить свой модуль OWIN-OpenId на свою страницу входа (настроить его по умолчанию в DNN) и выполнить вызов в Page_Load, и как только у вас будет токен, вы должны вручную создать пользователя DNN и сделать все логика входа в систему, взаимодействующая с AAD-graph-API, и получение необходимых утверждений. это нужно сделать в Startup.Auth.cs=›ConfigureAuth=›Notifications=›AuthorizationCodeReceived. с этим все будет хорошо, но проблема с кликом не решена   -  person lienysd    schedule 26.02.2015
comment
если вы хотите попробовать новый подход: давайте использовать Relying Party — ADFS. здесь вы будете использовать system.identitymodel.dll и system.identitymodel.services.dll, настраивая WSFederationAuthenticationModule и IHttpModule. Чтобы создать URL-адрес для входа, вы будете использовать WSFederationAuthenticationModule.CreateSignInRequest, а в WSFederationAuthenticationModule =›OnSignedIn вы сможете получить утверждения ADFS для своего RP и создать пользователя DNN и логику входа. Этот подход намного лучше и чище и не влияет на проверку подлинности с помощью форм. Надеюсь поможет ;)   -  person lienysd    schedule 26.02.2015
comment
Прошло некоторое время с тех пор, как я попробовал это. Спасибо за то, что вы поделились своими идеями. Насколько я понимаю, вышеизложенное работает для сценария единого входа. Я ищу гибридное решение. Гибридный? Я ищу DNN, чтобы делать все свои обычные пользовательские вещи. И мне нужен модуль для внешней аутентификации пользователей в их учетных записях Office 365. По сути, перенаправьте пользователя в Office 365. Заставьте их войти в систему. Получите коды. И используйте эти коды для связи с офисным API. Но и с этим есть проблемы.   -  person iiminov    schedule 19.03.2015
comment
Я борюсь с точно такой же проблемой. GetOwinContext() .Authentication.Challenge не перенаправляет на вход в Azure из события onclick. Были ли у кого-нибудь из вас новые идеи?   -  person tatigo    schedule 28.08.2015
comment
@tatigo происходит, когда триггер вызова вызывает несовместимость между OWIN и проверкой подлинности с помощью форм. Вот почему я использую параметр WSFederationAuthentication. Для этого подхода вам необходимо создать Relying Party на сервере ADFS, установить необходимые утверждения. На вашей стороне вам нужно создать поставщика аутентификации DNN, который использует библиотеки DLL, которые я упомянул выше, и System.IdentityModel.Tokens.ValidatingIssuerNameRegistry.dll с этими библиотеками DLL и персонализацией IHttpModule, WSFederationAuthenticationModule, ссылкой для входа в систему, логикой выхода, у вас будет решение.   -  person lienysd    schedule 31.08.2015
comment
@iiminov извините за поздний ответ .. Я создал поставщика аутентификации DNN, который аутентифицирует пользователей на сервере ADFS (и получает все утверждения, установленные на сервере), и в то же время пользователи могут входить в систему с аутентификацией форм DNN ... На странице входа существуют оба поставщика аутентификации, и пользователь может выбрать, какой из них использовать. Если вы все еще работаете над этим, я могу вам помочь. :)   -  person lienysd    schedule 31.08.2015
comment
@lienysd Мне, конечно, очень интересно, хотя я не уверен, что это сработает с нашей настройкой здесь.   -  person iiminov    schedule 01.09.2015
comment
@iiminov просто дайте мне знать, как и когда я могу вам помочь. Прямо сейчас моя версия работает над производством и до сих пор работала идеально. Надеюсь, этот подход поможет вам :)   -  person lienysd    schedule 01.09.2015
comment
@lienysd, когда вы так говорите, пройдет некоторое время, прежде чем я снова смогу вернуться к этой теме, так как в настоящее время я занят другой работой. Возможно, у вас есть репозиторий где-нибудь на github/codeplex/sourceforge, где другие разработчики могут внести свой вклад или задать вопросы? Поскольку это начинает выходить из-под контроля для комментариев, я могу вместо этого предложить чат stackoverflow.   -  person iiminov    schedule 02.09.2015
comment
@lienysd Я тоже буду признателен за вашу помощь! На данный момент обходной путь, который у меня есть, — это перенаправление с портала DNN на автономное приложение MVC, которое будет выполнять вход стандартным способом и перенаправлять обратно, когда это будет сделано. Это работает, но очень некрасиво. Есть ли место, где вам было бы удобно поделиться своей работой?   -  person tatigo    schedule 10.09.2015