2011-07-05 9 views
1

何度か前にthis questionと尋ねましたが、私はオフラインのOpenIDプロバイダを使って設定しています。OpenIDオフラインプロバイダでsucessful(fake)ログイン後にユーザーをリダイレクト

OpenID IDのシンプルなログインテキストボックスは、自動的にユーザーを受け入れ、ユーザーをログインしているとみなしてから、メインプロダクトページ(製品=>インデックス)にリダイレクトされるようにします。

しかし、私が知りませんでした(そしてインターネット上で見つからなかった)方法は、偽の認証プロセスの後に進む方法です。

私はこれを実行しようとしました:すべての

[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"); 
} 

まず、それは第四行(代わりに、ログインページが更新される)と第二にリダイレクトされていない、何も認証されたユーザーが本当にありません、私が意味しますウォッチウィンドウでUserをチェックしたとき、それはnullではありませんが、ユーザー名は空であり、クッキーが設定されていないという認証アイデンティティはありません。

P.S: 1.例外は発生していません。しかし、FormsAuthentication.RedirectFromLogin()メソッドを呼び出そうとすると、例外が発生します(HTTPヘッダーが設定された後、サーバーはCookieを変更できません)。 2.インデックスアクションメソッドは[Authorize]属性でマークされているので、誰かがブラウズしようとすると、ログイン画面にリダイレクトされますが、ログインすると(偽のログイン)、製品ページにリダイレクトされません?

また、私はこれを試してみました:

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

しかし、運を。

私は何を欠席しましたか?期待どおりに動作させる方法は?私は自分自身に依存することができますが、特にオフラインのローカルプロバイダー向けのOpenIDに関する適切なドキュメントが必要です。

答えて

1

チェックこの例:OpenID and OAuth using DotNetOpenAuth in 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"); 
} 

基本的には、あなたのアクションメソッドが2回呼び出されます:

初めてのユーザーによって提出されたフォームで。

2回目は、OpenIDプロバイダからのコールバック(リダイレクト)です。 今回はresponseの値があります。 response.Statusが有効な場合、FormsAuthenticationクラスを使用してユーザーをログインすることができます。最後に、彼をメインの製品ページにリダイレクトすることができます。

+0

+1ありがとう、私はそれを試してみると、このコードがローカルと実際のOpenIDサーバーの両方で正しく機能していると感じていますか? –

+0

* OpenIdOfflineProvider *でテストしていませんが、両方で動作するはずです。 –

+0

これは、 'response'が' null'であると一度呼び出され、OpenIDプロバイダからのコールバックが 'GET'リクエストとして呼び出され、// OpenIDプロバイダがアサーション応答を送信するコードに到達することはありません。私は、私が持っている2つの「ログイン」アクションメソッドを入れるために質問を編集します。 –

関連する問題