Перенаправить пользователя после успешного (поддельного) входа в OpenID Offline Provider - PullRequest
1 голос
/ 05 июля 2011

Много дней назад я задал этот вопрос , и у меня установлен работающий автономный поставщик OpenID (наверное).

Мне нужно простое текстовое поле для входа в систему с идентификатором OpenID, которое автоматически примет пользователя и будет считать пользователя вошедшим в систему, а затем я хочу, чтобы он был перенаправлен на главную страницу продуктов (Products => Index).

Но то, что я не знал (и не нашел в интернете), - это как продолжать процесс поддельной аутентификации.

Я пытался сделать это:

[HttpPost]
public ActionResult Login(string openid)//openid is the identifier taken from the login textbox
{
    var rely = new OpenIdRelyingParty();
    var req = rely.CreateRequest(openid);
    req.RedirectToProvider();
    return RedirectToAction("Index", "Products");
}

Во-первых, он не перенаправляется в 4-й строке (вместо этого обновляется страница входа в систему), а во-вторых, аутентифицированного пользователя там нет, я имею в виду, когда я проверял User в окне просмотра, он не равен нулю. но имя пользователя пустое, и нет идентифицированной личности, что, как мне кажется, означает, что файлы cookie не установлены.

P.S: 1. Никаких исключений не выбрасывается. Но когда я пытаюсь вызвать метод FormsAuthentication.RedirectFromLogin (), я получаю исключение (Сервер не может изменять файлы cookie после установки заголовков HTTP). 2. Метод действия индекса помечается атрибутом [Authorize], поэтому, когда кто-то пытается просмотреть Products, он перенаправляется на экран входа в систему, но при входе в систему (поддельный вход в систему) он не должен быть перенаправлен обратно на Продукты. страница

Я тоже это пробовал:

[HttpPost]
public ActionResult Login(string openid)
{
    var rely = new OpenIdRelyingParty();
    return rely.CreateRequest(openid).RedirectingResponse.AsActionResult();
}

Но не повезло.

Что я пропустил? и как заставить его работать как положено? Я могу зависеть от себя, но мне нужна приличная документация для OpenID, особенно для автономного локального провайдера.

1 Ответ

1 голос
/ 05 июля 2011

Проверьте этот пример: OpenID и OAuth с использованием DotNetOpenAuth в ASP.NET MVC

public ActionResult OpenId(string openIdUrl)
{
    var response = Openid.GetResponse();
    if (response == null)
    {
        // User submitting Identifier
        Identifier id;
        if (Identifier.TryParse(openIdUrl, out id))
        {
            try
            {
                var request = Openid.CreateRequest(openIdUrl);
                var fetch = new FetchRequest();
                fetch.Attributes.AddRequired(WellKnownAttributes.Contact.Email);
                fetch.Attributes.AddRequired(WellKnownAttributes.Name.First);
                fetch.Attributes.AddRequired(WellKnownAttributes.Name.Last);
                request.AddExtension(fetch);
                return request.RedirectingResponse.AsActionResult();
            }
            catch (ProtocolException ex)
            {
                _logger.Error("OpenID Exception...", ex);
                return RedirectToAction("LoginAction");
            }
        }
        _logger.Info("OpenID Error...invalid url. url='" + openIdUrl + "'");
        return RedirectToAction("Login");
    }

    // OpenID Provider sending assertion response
    switch (response.Status)
    {
        case AuthenticationStatus.Authenticated:
            var fetch = response.GetExtension<FetchResponse>();
            string firstName = "unknown";
            string lastName = "unknown";
            string email = "unknown";
            if(fetch!=null)
            {
                firstName = fetch.GetAttributeValue(WellKnownAttributes.Name.First);
                lastName = fetch.GetAttributeValue(WellKnownAttributes.Name.Last);
                email = fetch.GetAttributeValue(WellKnownAttributes.Contact.Email);
            }
            // Authentication       
            FormsAuthentication.SetAuthCookie(userName: email, createPersistentCookie: false);
            // Redirection
            return RedirectToAction("Index", "Products");
        case AuthenticationStatus.Canceled:
            _logger.Info("OpenID: Cancelled at provider.");
            return RedirectToAction("Login");
        case AuthenticationStatus.Failed:
            _logger.Error("OpenID Exception...", response.Exception);
            return RedirectToAction("Login");
    }
    return RedirectToAction("Login");
}

Как правило, ваш метод действия вызывается дважды:

Впервые ваша форма будет отправлена ​​пользователем.

Второй раз - обратный вызов (перенаправление) от поставщика OpenID. На этот раз будет значение для response. Если response.Status является действительным, вы можете войти в систему, используя класс FormsAuthentication, и, наконец, вы можете перенаправить его на страницу основных продуктов.

...