DotNetOpenAuth - как бы «View» взаимодействовал с этим - PullRequest
2 голосов
/ 29 ноября 2010

Я искал рефакторинг моего контроллера входа для лучшей читабельности кода.При этом я наткнулся на программный пример проверяющей стороны OpenID , который выглядит следующим образом

using DotNetOpenAuth.Messaging;

public ActionResult LogOn()
{
    var openid = new OpenIdRelyingParty();
    IAuthenticationResponse response = openid.GetResponse();

    if (response != null)
    {
        switch (response.Status)
        {
            case AuthenticationStatus.Authenticated:
                FormsAuthentication.RedirectFromLoginPage(
                    response.ClaimedIdentifier, false);
                break;
            case AuthenticationStatus.Canceled:
                ModelState.AddModelError("loginIdentifier",
                    "Login was cancelled at the provider");
                break;
            case AuthenticationStatus.Failed:
                ModelState.AddModelError("loginIdentifier",
                    "Login failed using the provided OpenID identifier");
                break;
        }
    }           

    return View();
}

[System.Web.Mvc.AcceptVerbs(HttpVerbs.Post)]
public ActionResult LogOn(string loginIdentifier)
{
    if (!Identifier.IsValid(loginIdentifier))
    {
        ModelState.AddModelError("loginIdentifier",
                    "The specified login identifier is invalid");
        return View();
    }
    else
    {
        var openid = new OpenIdRelyingParty();
        IAuthenticationRequest request = openid.CreateRequest(
            Identifier.Parse(loginIdentifier));

        // Require some additional data
        request.AddExtension(new ClaimsRequest
        {
            BirthDate = DemandLevel.NoRequest,
            Email = DemandLevel.Require,
            FullName = DemandLevel.Require
        });

        return request.RedirectingResponse.AsActionResult();
    }
}

Теперь это выглядит намного чище и легче для чтения, чем то, что я использовал из загружаемых примеров.(Я скачал самую последнюю версию, и это пример, который они приводят - это тот же самый пример, на котором я построил свое приложение 5 месяцев назад.)

    [ValidateInput(false)]
    public ActionResult Authenticate(string returnUrl) {
        var response = openid.GetResponse();
        if (response == null) {
            // Stage 2: user submitting Identifier
            Identifier id;
            if (Identifier.TryParse(Request.Form["openid_identifier"], out id)) {
                try {
                    return openid.CreateRequest(Request.Form["openid_identifier"]).RedirectingResponse.AsActionResult();
                } catch (ProtocolException ex) {
                    ViewData["Message"] = ex.Message;
                    return View("Login");
                }
            } else {
                ViewData["Message"] = "Invalid identifier";
                return View("Login");
            }
        } else {
            // Stage 3: OpenID Provider sending assertion response
            switch (response.Status) {
                case AuthenticationStatus.Authenticated:
                    Session["FriendlyIdentifier"] = response.FriendlyIdentifierForDisplay;
                    FormsAuthentication.SetAuthCookie(response.ClaimedIdentifier, false);
                    if (!string.IsNullOrEmpty(returnUrl)) {
                        return Redirect(returnUrl);
                    } else {
                        return RedirectToAction("Index", "Home");
                    }
                case AuthenticationStatus.Canceled:
                    ViewData["Message"] = "Canceled at provider";
                    return View("Login");
                case AuthenticationStatus.Failed:
                    ViewData["Message"] = response.Exception.Message;
                    return View("Login");
            }
        }
        return new EmptyResult();
    }

Теперь в этом примере слишком много операторов if на мой взгляди с дополнительной обработкой, которую я должен добавить в (activity logging и checking for new user или add to existing account), он начинает становиться действительно запутанным и очень быстрым.

К сожалению, если бы я реорганизовал мой код вбольше похоже на первый пример, я застрял на одной маленькой проблеме.Как View взаимодействует с этим?Я имею в виду, он ищет openid.GetResponse(), но как мне отправить этот ответ?

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

1 Ответ

3 голосов
/ 29 ноября 2010

Вы не отправляете этот ответ.OpenID провайдер делает, когда вы нажимаете утвердить или отменить на своей странице одобрения.Насколько я понимаю, здесь происходит то, что, например, Google возвращает кучу данных через GET, а затем DotNetOpenAuth анализирует, когда вы вызываете openid.GetResponse().

Я опубликовал базовый OpenID для реализации MVC с большим количеством комментариевэто также показывает регистрацию пользователей.Вы можете найти его в http://mvcopenid.codeplex.com. Он все еще не так чист, как верхний образец, но я нахожу его довольно чистым.В конце концов, я проведу рефакторинг, но мне нужно выяснить, как обойти модель связки MVC, потому что мне не нравится код типа Request.Form["openid_identifier"].

...