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