2010-11-29 7 views
2

コードの読みやすさを向上させるために、ログインコントローラのリファクタリングを検討してきました。そうすることで、私は今、これは私がダウンロード可能な例から使用したものよりもヒープは、クリーンで読みやすくなります。このDotNetOpenAuth - "View"はこれとどのようにやりとりしますか

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(); 
    } 
} 

のように見えますProgrammatic OpenID Relying Party exampleに出くわしました。 (私は最新バージョンをダウンロードし、これは彼らが与える例である - 。私は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(); 
    } 

今、その例は、私の好みのためであれば、あまりにも多くの文を持っており、私が追加しなければならない余分な処理(activity loggingchecking for new userまたはadd to existing account)と一緒に、それは本当に面倒で本当に速くなり始めます。

残念ながら、私のコードを最初の例のようにリファクタリングすると、小さな問題が残っています。ビューはこれとどのように相互作用しますか?つまり、openid.GetResponse()を探していますが、その回答をどのように提出しますか?

私が言ったように、私はこの作業を得ることができます、それは私の現在の方法よりもはるかにクリーンであるように見えます。

+0

最後の行はどのように機能しましたか? 'return request.RedirectingResponse.AsActionResult();' 私はいくつかの名前空間の使用法を追加しましたが、私はこの部分をどのように進めるのかを考えることができません。 HttpRequestBaseにはRedirectingResponseの参照が含まれていません。 – zeristor

答えて

3

あなたはこの回答を提出しません。 OpenIDプロバイダは、承認ページで承認またはキャンセルをクリックすると動作します。私がここまで進んでいることを理解する限り、例えば、GoogleはGET経由でたくさんのデータを返し、次にopenid.GetResponse()に電話するとDotNetOpenAuthを解析します。

私は、ユーザ登録を特色とする、非常にコメントの多いMVCの基本的なOpenID実装を公開しました。 http://mvcopenid.codeplex.comで見つけることができます。それはまだ上のサンプルほどきれいではありませんが、私はそれがかなりきれいであることがわかります。私は最終的にそれをリファクタリングしますが、私はRequest.Form["openid_identifier"]のようなコードが好きではないので、MVCのモデルバインダをうまく使いこなす方法を理解する必要があります。

+1

ねえ、本当にクールだね。私はそれをチェックするつもりだ! –

+0

「プロバイダ名」も同時に取得できるかどうか知っていますか?私のアプリケーションでは、無制限のOpenIDを持つことができるので、各ログインが関連付けられているプロバイダを参照したいと思います。 –

+0

あなたはプロバイダのためにかなりの名前を意味しますか?まだ試していませんが、SimpleRegistrationでは可能ではないと思います。私はほとんどのクライアントがかなりの名前のためにいくつかのリストを使用すると思います。しかし、私が言ったように私はまだ深く掘り下げていない。 – gligoran

関連する問題