2016-11-08 16 views
2

私はVisual Studio 2013プロジェクトウィザードを使用してASP.NETでWEB APIプロジェクトを作成しました。それから私は、この関数を呼び出すためにC#でクライアント側のコードを書いたASP.NET WEB API外部ログイン

// GET api/Account/ExternalLogin 
[OverrideAuthentication] 
[HostAuthentication(DefaultAuthenticationTypes.ExternalCookie)] 
[AllowAnonymous] 
[Route("ExternalLogin", Name = "ExternalLogin")] 
public async Task<IHttpActionResult> GetExternalLogin(string provider, string error = null) 
{ 
    if (error != null) 
    { 
     return Redirect(Url.Content("~/") + "#error=" + Uri.EscapeDataString(error)); 
    } 

    if (!User.Identity.IsAuthenticated) 
    { 
     return new ChallengeResult(provider, this); 
    } 

    ExternalLoginData externalLogin = ExternalLoginData.FromIdentity(User.Identity as ClaimsIdentity); 

    if (externalLogin == null) 
    { 
     return InternalServerError(); 
    } 

    if (externalLogin.LoginProvider != provider) 
    { 
     Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie); 
     return new ChallengeResult(provider, this); 
    } 

    ApplicationUser user = await UserManager.FindAsync(new UserLoginInfo(externalLogin.LoginProvider, 
     externalLogin.ProviderKey)); 

    bool hasRegistered = user != null; 

    if (hasRegistered) 
    { 
     Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie); 

     ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(UserManager, 
      OAuthDefaults.AuthenticationType); 
     ClaimsIdentity cookieIdentity = await user.GenerateUserIdentityAsync(UserManager, 
      CookieAuthenticationDefaults.AuthenticationType); 

     AuthenticationProperties properties = ApplicationOAuthProvider.CreateProperties(user.UserName); 
     Authentication.SignIn(properties, oAuthIdentity, cookieIdentity); 
    } 
    else 
    { 
     IEnumerable<Claim> claims = externalLogin.GetClaims(); 
     ClaimsIdentity identity = new ClaimsIdentity(claims, OAuthDefaults.AuthenticationType); 
     Authentication.SignIn(identity); 
    } 

    return Ok(); 
} 

:それは社会的なログインのために、この関数を作成した不思議な

public async Task LogInAsync(string url, string provider) 
{ 
    using (HttpClient client = new HttpClient()) 
    { 
     string request = url + "/api/Account/ExternalLogin"; 
     var query = HttpUtility.ParseQueryString(string.Empty); 
     query["provider"] = provider; 
     query["error"] = ""; 
     request += "?" + query.ToString(); 

     HttpResponseMessage responseMessage = await client.GetAsync(request); 
     if (responseMessage.IsSuccessStatusCode) 
     { 
     string responseContent = await responseMessage.Content.ReadAsStringAsync(); 
     } 
    } 
} 

、私は、サーバーからこのエラー応答を受信します。

のStatusCode:400、のreasonPhrase: '不正な要求'、バージョン:1.1、内容: System.Net.Http.StreamContent、ヘッダ:{プラグマ:キャッシュなし
X-SO urceFiles:???? = UTF-8 B RTpcUHJvamVjdFxEYXRpbmdcRGF0aW5nLlNlcnZlclxhcGlcQWNjb3VudFxFeHRlcm5hbExvZ2lu = のCache-Control:キャッシュなし日付:火曜、2016年11月8日午前15時12分33秒GMT
サーバー:マイクロソフト-IIS/8.0 X-パワード・バイ: ASP.NETコンテンツの長さ:24 コンテンツタイプ:text/plain; charset = UTF-8 Expires:-1}

ウェブブラウザでそれぞれのリンクをナビゲートしようとすると、同じエラーが表示されます。サーバーのデバッグでは、この関数のそれぞれのエントリポイントはヒットしません。私は間違って何をしていますか?それはGET動詞なので、どちらにでもうまくアクセスできるはずです。

私が最も困惑しているのは、この機能はすべてのWEB APIプロジェクトにデフォルトで含まれていますが、実際にどのような参照や参照方法も見つけられません。

+0

この問題を解決できますか? –

+0

この問題の簡単な要約は、Visual Studio 2013がAPIを通じてソーシャルログイン用の無効なコードを生成することです。これは誰のためにもうまくいかず、素早いハックで修正するのに適していません。このナンセンスを解決する正しい方法は、この機能に特化した別個のNugetパッケージを使用することです。私はこの文脈で1年前に選んだものは覚えていませんが、これは必要な動作を実現するために数千行のコードを含む本格的な拡張機能です。それが役に立てば幸い。 –

答えて

0

テンプレートの1つを使用しているので、私はプロジェクトで派生したいくつかのオーバーライドされたメソッドを持つOAuthAuthorizationServerProviderを使用していると仮定しています。それらにいくつかのブレークポイントをドロップします。なぜなら、おそらくそれが失敗しているからです。

+0

この度はありがとうございます。メソッドが[AllowAnonymous]および[OverrideAuthentication]としてマークされている場合、OAuthAuthorizationServerProviderはこれにどのように関連付けることができますか?私が正しく理解していれば、標準のOAuth処理から除外します。 –

関連する問題