2016-08-25 7 views
2

私はMVC5をインストールしており、1日後に手を差し伸べて助けを得る時期だと思いますが、OAuth Guru、いいえ。私はインターネットを検索しましたが、特に認証プロセスのみに焦点を当てたものは何もありませんでした。あるいは、ディスカッションが非常に緩やかで、私が学習しようとしている特定のフレームワークのロジックの概念を理解できません。Twitterでユーザーを認証するにはログインの目的ではない

私はMVCコントローラを持っており、ユーザが認証するためにボタンをクリックすると私の見解では、それはSocialという単純なアクションです。だから私のURLはhttp://localhost://mywebsite/enterprise/socialです。これは学校のものですが、私は助けが必要です。私は始めから使い始めています。これは働くために使用する1.0 OAuthです。

私はTwitter用のログインを使いたくない、私は数年前に作ったカスタムのTwitterボックスに使用されていて、tweeting、re-tweeting、基本的にTwitterと同じ時間に使用されます。 サイトのログインには、はありません。

私は、Twitterへの誘導、サインイン、同じMVCページへのリダイレクト、トークンのキャプチャ、自分のストレージへの保存を行いました。

それ以降のすべての呼び出しは、データベースへの独自の呼び出しを作成し、将来の呼び出しのために作成されているため、特別な目的はありません。

ここに私のコントローラがありますが、どこが間違っていますか?ここで

public async Task Social(FormCollection form) 
{ 

    //var auth = new MvcSignInAuthorizer 
    var auth = new MvcAuthorizer 
    { 
     CredentialStore = new InMemoryCredentialStore 
     { 
      ConsumerKey = ConfigurationManager.AppSettings["twitterConsumerKey"], 
      ConsumerSecret = ConfigurationManager.AppSettings["twitterConsumerSecret"] 
     } 
    }; 

    string twitterCallbackUrl = Request.Url.ToString().Replace("Begin", "Complete"); 
    auth.Callback = new Uri(twitterCallbackUrl); 

    await auth.BeginAuthorizationAsync(); 
} 
public async Task<PartialViewResult> CompleteAsync() 
{ 
    var auth = new MvcAuthorizer 
    { 
     CredentialStore = new InMemoryCredentialStore() 
    }; 

    await auth.CompleteAuthorizeAsync(HttpContext.Request.Url); 

    var credentials = auth.CredentialStore; 
    string oauthToken = credentials.OAuthToken, 
      oauthTokenSecret = credentials.OAuthTokenSecret, 
      screenName = credentials.ScreenName, 
      userName = Membership.GetUser().UserName; 
    ulong userID = credentials.UserID; 


    System.Web.Profile.ProfileBase pro = System.Web.Profile.ProfileBase.Create(userName, true); 
    pro.SetPropertyValue("twoauth_token", oauthToken); 
    pro.SetPropertyValue("twtokensecret", oauthTokenSecret); 
    pro.Save(); 

    HttpContext.Response.SetOauthFromCookie("twit", oauthTokenSecret, oauthToken, userName, true); 

    ViewBag.IsTwitterConnected = IsTwitterConnected; 
    return PartialView("_SocialPartial"); 
} 

私はそれがMVC 5 4.6.2フレームワークで実行する必要が何をすべきか、コードの私のStartup.cs

public partial class Startup 
    { 
     public void ConfigureAuth(IAppBuilder app) 
     { 
      // Use a cookie to temporarily store information about a user logging in with a third party login provider 
      app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 



      app.UseTwitterAuthentication(
       new TwitterAuthenticationOptions 
       { 
        ConsumerKey = ConfigurationManager.AppSettings["twitterConsumerKey"], 
        ConsumerSecret = ConfigurationManager.AppSettings["twitterConsumerSecret"], 
        Provider = new LinqToTwitterAuthenticationProvider() 
       }); 

     } 
    } 
} 

転位があるだろう驚くばかり!

答えて

1

「私はTwitterをログイン用に使用したくありません。古いユーザー名/パスワードの資格情報ログインを参照している場合、これは廃止され、とにかく使用することはできません。そのSystem.Web.Profile...SetOAuthFromCookie...は、LINQ to Twitterの一部ではありません。おそらくあなたがログインコードと呼んでいたものでしょうか?

通常のOAuthワークフローを実装したいと思うようです。セッション状態にあなたのトークンを持続CredentialStoreSessionStateCredentialStoreであることを

public class OAuthController : AsyncController 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    public async Task<ActionResult> BeginAsync() 
    { 
     //var auth = new MvcSignInAuthorizer 
     var auth = new MvcAuthorizer 
     { 
      CredentialStore = new SessionStateCredentialStore 
      { 
       ConsumerKey = ConfigurationManager.AppSettings["consumerKey"], 
       ConsumerSecret = ConfigurationManager.AppSettings["consumerSecret"] 
      } 
     }; 

     string twitterCallbackUrl = Request.Url.ToString().Replace("Begin", "Complete"); 
     return await auth.BeginAuthorizationAsync(new Uri(twitterCallbackUrl)); 
    } 

    public async Task<ActionResult> CompleteAsync() 
    { 
     var auth = new MvcAuthorizer 
     { 
      CredentialStore = new SessionStateCredentialStore() 
     }; 

     await auth.CompleteAuthorizeAsync(Request.Url); 

     // This is how you access credentials after authorization. 
     // The oauthToken and oauthTokenSecret do not expire. 
     // You can use the userID to associate the credentials with the user. 
     // You can save credentials any way you want - database, 
     // isolated storage, etc. - it's up to you. 
     // You can retrieve and load all 4 credentials on subsequent 
     // queries to avoid the need to re-authorize. 
     // When you've loaded all 4 credentials, LINQ to Twitter will let 
     // you make queries without re-authorizing. 
     // 
     //var credentials = auth.CredentialStore; 
     //string oauthToken = credentials.OAuthToken; 
     //string oauthTokenSecret = credentials.OAuthTokenSecret; 
     //string screenName = credentials.ScreenName; 
     //ulong userID = credentials.UserID; 
     // 

     return RedirectToAction("Index", "Home"); 
    } 
} 

お知らせ:その場合、私はこのように、コードを分離し、私の呼び出し元のコードを簡素化するためにOAuthControllerを使用しています。資格情報が保存される方法が気に入らない場合は、独自のICredentialStoreを実装してください。それはそのように拡張可能です。また、CompleteAsyncのコメントを見てください。これらは、DB(または、必要に応じてクッキー内のユーザー固有のトークン)に保持するためにすべてのクレデンシャルを抽出する方法を示しています。

証明書が承認した後にセッション状態にあるので、TwitterへLINQを実行するために必要とする任意のコードは次のように、これらの証明書が利用可能かどうかを確認することができます

 if (!new SessionStateCredentialStore().HasAllCredentials()) 
      return RedirectToAction("Index", "OAuth"); 

LINQでのTwitterに、場合許可者は4つの資格情報をすべて持っており、TwitterContextをインスタンス化して必要な処理を行うことができます。 HasAllCredentials()は、これら4つの資格情報すべてが利用可能かどうかを示しています。そうでない場合は、OAuthプロセスを再開してください。このデモでは、ユーザーをページに移動して承認プロセスを手動で開始しますが、直接BeginAsyncにリダイレクトすることができます。

別の改善、実際のコードでは、BeginAsyncを変更することですので、それが(例えばクッキーとして、あるいは別のストア、)データベースからユーザーの資格情報を探し、SessionStateCredentialStoreを移入し、呼び出し元に戻ってリダイレクトします。ユーザーの資格情報が使用できない場合は、OAuthプロセスを介してユーザーにアクセスさせ、資格情報を保存して、再度実行する必要はありません。

デモの全体を表示したい場合は、LINQ to Twitter SamplesフォルダのMVCDemo projectにアクセスしてください。

以下のエラーが表示される場合は、Twitterのアプリケーション設定で「コールバックURL」を入力する必要があります。ここで誰かが同じ問題を抱えていたQ/Aです:

Desktop applications only support the oauth_callback value 'oob'/oauth/request_token


Receiving Server Error 



Server Error in '/' Application. 
<?xml version="1.0" encoding="UTF-8"?> 
<hash> 
<error>Desktop applications only support the oauth_callback value 'oob'</error> 
<request>/oauth/request_token</request> 
</hash> 
- Please visit the LINQ to Twitter FAQ (at the HelpLink) for help on resolving this error. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: LinqToTwitter.TwitterQueryException: <?xml version="1.0" encoding="UTF-8"?> 
<hash> 
<error>Desktop applications only support the oauth_callback value 'oob'</error> 
<request>/oauth/request_token</request> 
</hash> 
- Please visit the LINQ to Twitter FAQ (at the HelpLink) for help on resolving this error. 

Source Error: 


Line 55:   protected async void AuthorizeButton_Click(object sender, EventArgs e) 
Line 56:   { 
Line 57:    await auth.BeginAuthorizeAsync(Request.Url); 
Line 58:   } 
Line 59:  } 


Source File: D:\Users\Errrrrrr\Documents\visual studio 2015\ForTesting\LinqToTwitter-master\Samples\net46\CSharp\AspNetSamples\WebFormsDemo\OAuth.aspx.cs Line: 57 

Stack Trace: 


[TwitterQueryException: <?xml version="1.0" encoding="UTF-8"?> 
<hash> 
    <error>Desktop applications only support the oauth_callback value 'oob'</error> 
    <request>/oauth/request_token</request> 
</hash> 
- Please visit the LINQ to Twitter FAQ (at the HelpLink) for help on resolving this error.] 
    LinqToTwitter.Net.<HandleUnauthorizedAsync>d__4.MoveNext() +494 
    System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +14139120 
    System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +62 
    LinqToTwitter.Net.<ThrowIfErrorAsync>d__0.MoveNext() +360 
    System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +14139120 
    System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +62 
    LinqToTwitter.<HttpGetAsync>d__57.MoveNext() +1159 
    System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +14139120 
    System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +62 
    LinqToTwitter.<GetRequestTokenAsync>d__50.MoveNext() +675 
    System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +14139120 
    System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +62 
    LinqToTwitter.<BeginAuthorizeAsync>d__14.MoveNext() +568 
    System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +14139120 
    System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +62 
    System.Runtime.CompilerServices.TaskAwaiter.GetResult() +28 
    WebFormsDemos.<AuthorizeButton_Click>d__2.MoveNext() in D:\Users\Edddddd\Documents\visual studio 2015\ForTesting\LinqToTwitter-master\Samples\net46\CSharp\AspNetSamples\WebFormsDemo\OAuth.aspx.cs:57 
    System.Runtime.CompilerServices.<>c.<ThrowAsync>b__6_0(Object state) +56 
    System.Web.Util.SynchronizationHelper.SafeWrapCallback(Action action) +110 
    System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +14139120 
    System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +62 
    System.Web.Util.WithinCancellableCallbackTaskAwaiter.GetResult() +32 
    System.Web.UI.<ProcessRequestMainAsync>d__523.MoveNext() +7762 
+0

こんにちはジョー、私は数年のためにあなたのライブラリを使用しました 、私は一年前、私まで問題があったことがありません何度も諦めてしまった。ダウンロードされたサンプルでも、サーバーのエラーが発生するので、これは私の側です。エラーポストを見て、その意味を教えてください。ところで、authincationが完了するとすぐに、私は将来の呼び出しのためにデータベースにすべてを保存するので、ユーザーがTwitterに誘導され、ログインし、リダイレクトされ、自分の情報をキャプチャして保存できるので、それはそれですが、入札のための神、インターネット上の誰もこの話題だけで書くことを拒否します。 –

+0

Twitterのアプリケーションで「コールバックURL」を入力することをお勧めします。http://stackoverflow.com/questions/21170531/desktop-applications-only-support-the-oauth-callbackの回答と同様です-value-oob-oauth-request-t –

+0

私はあなたのWebFormsデモを使用し、WebFormsページにリダイレクトされましたが、今はもっとクリーンで、この方法で動作します。 –

関連する問題