2016-05-20 12 views
10

OAuth認証ワークフローを使用して、Salesforceに対して.NETでMVCアプリケーションを認証する実例を得ようとしています。私はかなり簡単なthis walkthroughを参照してきました。 Google認証を有効にすることと非常によく似ています。個々のアカウント認証テンプレートを使用して.NET MVCプロジェクトをセットアップし、Salesforceで新しい接続されたアプリケーションを起動することに至りました。次にSalesforceのOwin.Security.Providersライブラリを追加し、Startup.Auth.csを少し調整し、Salesforceアプリと承認とトークンのエンドポイントからClientIdClientSecretを追加します。提案するコールバックURLはhttp://localhost:[port]/signin-salesforceで、Google認証に使用されるコールバックURLとよく似ています。Salesforceを使用したMVC OAuth認証がログインページに戻る

私はSalesforceへリダイレクトされていますし、ログインすることができますが、戻って私のMVCアプリケーションに私を返すハンドシェイクは、私は見極めることができない問題が発生しているようです。私はログインページにリダイレクトされ、Salesforceとのアクティブセッションが確実にあるにもかかわらず、.NETはログイン情報を認識していないようです(Salesforceダッシュボードが自動的にログインします)。コードでは、物事は横向きにここに行くために開始します。

// GET: /Account/ExternalLoginCallback 
[AllowAnonymous] 
public async Task<ActionResult> ExternalLoginCallback(string returnUrl) 
{ 
    var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); 
    if (loginInfo == null) 
    { 
     return RedirectToAction("Login"); 
    } 
    //more code we never reach 
} 

loginInfoは常にnullです。だから、把握する.NETへのリクエストのどのように送られている、私はバイオリン弾きになって、好奇心旺盛な応答を取得するパラメータの束とlocalhost:[port]/signin-salesforceに対する要求が発生しました:

を発見

HTTP/1.1 302 ?

場所:/アカウント/ ExternalLoginCallbackエラー=

サーバーACCESS_DENIED:マイクロソフト-IISを/ 10.0

のSet-Cookie:.AspNet.Correlation.Salesforce =;パス= /;期限切れになるには=木、01-JAN-1970 00:00:00 GMT

X-、ソースファイル:= UTF-8 B YzpcdXNlcnNcc3RldmUuY2FtaXJlXGRvY3VtZW50c1x2aXN1YWwgc3R1ZGlvIDIwMTVcUHJvamVjdHNcU2FsZXNGb3JjZUludGVncmF0aW9uXFNhbGVzRm9yY2VJbnRlZ3JhdGlvblxzaWduaW4tc2FsZXNmb3JjZQ == =

X-Poweredのバイ:????ASP.NET

日:金、2016年5月20日21時46分09秒GMT

のContent-Length:0

がLocationヘッダーに注意してください。これは、.NETに/Account/ExternalLoginCallbackへのリダイレクトを、エラーパラメータ "access_denied"で指示します。 Owinにいくつかのトレースを有効にすると、何かは400 .NETまたは.NET、のいずれかに戻っていることが明らかになったが、私は何を知りません。

だから私はここにいる。 A nullコントローラ内のloginInfoオブジェクトと、一部のWeb要求で何かが間違っているという証拠。私は他のいくつかの関連する質問を熟読しましたが、ほとんどSalesForceに焦点を当てておらず、実際には適用できない回答を提供しています(たとえば、私は有効にするためのGoogle+ APIはありません)。これを修正する方法に関するアイデア? LOGININFOは常にそれが本当にすべきではないとき、バックナルくると誰も持つ問題へ

+1

あなたはこの解決策を見つけましたか?私は同じ問題があります。 – vaibinewbee

+1

@vaibinewbee残念ながら、私はしませんでした。私はいくつかの研究のためにこれをやっていましたが、完了する必要はありませんでしたので、私は解決策を探し続けました。この質問に対する活動が完全に欠如していることを考慮すると、Salesforceのフォーラムにお問い合わせいただくか、Salesforceにご連絡ください。あなたがそれを解決したら、答えをここで共有してください。私は偉大な答えに使用されるのを待っている緑のチェックマークを持っています。 – Ellesedil

+1

外部認証を 'localhost'でテストしないでください。実世界のドメインで試してみて、結果を教えてください。 –

答えて

0

、しかし、これは私がFacebookやGoogleと同様の問題に日々を過ごす、あなたの問題を解決しないことがあります。私はExternalLoginCallbackが呼び出される前にHttpContextセッションをクリアしてしまいました。それ以来、完璧に動作しています。これを修正すると言っているわけではありませんが、うまくいけばそれは誰かを助けるでしょう。

// 
// POST: /Account/ExternalLogin 
[HttpPost] 
[AllowAnonymous] 
[ValidateAntiForgeryToken] 
public ActionResult ExternalLogin(string provider, string returnUrl) 
{ 
    // Clear any other session first as this seems to cause unexpected null responses. 
    if (ControllerContext.HttpContext.Session != null) 
    { 
     ControllerContext.HttpContext.Session.RemoveAll(); 
    } 

    // Request a redirect to the external login provider 
    return new ChallengeResult(provider, Url.Action("ExternalLoginCallback", "Account", new { ReturnUrl = returnUrl })); 
} 

私は私をテストしていたとき、私はフィドラーで確認し、あなたが、これは助けにはなりません有効な応答を取得していない場合、私は、戻って大丈夫トークンを得ていました。

2

IDサーバーのIDと一致するためにはリダイレクトURIが必要です。再度ログインページにリダイレクトされると、リダイレクトURIがクライアントシークレットとクライアントIDと一致しないように見えます。

SalesForce Identityサーバーには、認証が完了したときにリダイレクトされるパスを決定するリダイレクトURIがあります。場合によっては、完全に認証されるためにURIをクライアントIDとシークレットで提供する必要があります。

+0

私は自分自身でこれをテストする機会はありませんでしたが(そして私はいつでもすぐにはわかりませんが)、これは次にチェックするべきであると思われます。クライアントIDはクライアントのプロパティでのみ設定しますが、URLは含めません。 – Ellesedil

1

私はStartup.Auth.csにチェックを入れて、あなたの組織が正しいインスタンスを持っていて、ウォークスルーで別のインスタンスを使用していないことを確認します。たとえば、私の組織はna10.salesforce.comから始まります。このウォークスルーはap1.salesforce.comを使用しています。

AuthorizationEndpoint = "https://**ap1**.salesforce.com/services/oauth2/authorize", 
    TokenEndpoint = "https://**ap1**.salesforce.com/services/oauth2/token" 

私もクッキーとキャッシュがクリアされていることを確認します。たとえば、私は OAuthの情報なしで、全く新しいVS 2015 MVCプロジェクトを開始し、私はSFDCプロバイダ経由でログインしました。クライアントID、秘密、SFDCセクションさえありません!

私はウォークスルーを行い、SFDC OAuthで認証することができました。あなたが言ったように、それはとても簡単でした。私は、あなたのコードを、何かを心配するだけでなく、単純なものを裂くことはありません。

+0

私は間違いなく、プロジェクトのURLを自分のインスタンスのURLに更新しました。二重チェックするのは良いことですが、これは私の問題ではありませんでした。 – Ellesedil

1

さらに、Owin.Security.Providers.Salesforceコードをダウンロードしてプロジェクトの参照に追加して、問題をデバッグできるようにしました。私はoauthコードスワップの応答が実行されているときに、「応答ステータスコードは成功を示していません:400(TLS 1.1以上が必要)」という例外を受け取りました。私はサンドボックスをオフに働いていたとSalesforceは私のアカウントコントローラーコンストラクタは私の問題を修正の上ので、このコード行を追加6月2016年開始無効TLS 1.0を持っています

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; 
関連する問題