NULL ClaimsResponse с DotNetOpenAuth в приложении ASP.NET MVC 2
Я пытаюсь заставить DotNetOpenAuth (последнюю версию) работать с веб-сайтом ASP.NET MVC 2. Первая часть работает, действие вызывается, когда пользователь выбирает провайдера OpenID, я передаю правильный идентификатор, затем меня перенаправляют правильно на сайт провайдера, меня перенаправляют обратно на мой сайт, но есть проблема.
Запросы, которые я запросил, являются недействительными (см. Код ниже).
public ActionResult TryAuth(string openid_identifier)
{
var openid = new OpenIdRelyingParty();
var response = openid.GetResponse();
if(response== null)
{
var req = openid.CreateRequest(openid_identifier);
req.AddExtension(new ClaimsRequest
{
Email = DemandLevel.Require,
Nickname = DemandLevel.Require
});
return req.RedirectingResponse.AsActionResult();
}
switch(response.Status)
{
case AuthenticationStatus.Authenticated:
{
var data = response.GetExtension(typeof(ClaimsResponse)) as ClaimsResponse;
// data is null <-----------------------------------------
return View("Index");
}
}
return View("Index");
}
Я был бы очень признателен, если бы кто-нибудь мог указать на (не очень) очевидную ошибку, которую я делаю.
2 ответа
Пожалуйста, просмотрите все подобные вопросы. Отослать это
Ваш код выглядит хорошо. Убедитесь, что вы активировали AXFetchAsSregTransform в своем файле web.config, чтобы максимизировать вероятность того, что вы что-то получите обратно. Однако поставщик должен предоставить вам какие-либо атрибуты. Некоторые провайдеры, такие как Yahoo, требуют, чтобы ваш RP правильно реализовывал RP Discovery, что демонстрируют примеры RP, поставляемые с DotNetOpenAuth.
Вот мой пост в блоге о том, как правильно сделать RP Discovery. Сделайте это и попробуйте сайты, которые вы тестировали снова. Помните также, что некоторые провайдеры кэшируют результаты RP Discovery, поэтому вы можете применить все свои исправления RP Discovery, и вам все равно придется подождать час или день, прежде чем провайдеры начнут предоставлять вам данные.
У меня была такая же проблема, пока я не обнаружил, что для Google вы должны установить поле электронной почты для DomainLevel.Require вместо DomainLevel.Request (Необязательно)
fields.Email = DemandLevel.Require;