我已經使用Visual Studio 2013項目嚮導在ASP.NET中創建WEB API項目。它創造了這個功能對社會登錄: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();
}
然後我在C#寫了一個客戶端的代碼來調用這個函數:
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:'Bad Request',Version:1.1,Content: System.Net.Http.StreamContent,Headers:{Pragma:no-cache
X-So urceFiles: = UTF-的8B RTpcUHJvamVjdFxEYXRpbmdcRGF0aW5nLlNlcnZlclxhcGlcQWNjb3VudFxFeHRlcm5hbExvZ2lu = 的Cache-Control:???無緩存時間:星期二,2016年11月8日15點12分33秒GMT
服務器:Microsoft-IIS/8.0 X供電,通過: ASP.NET Content-Length:24 Content-Type:text/plain; charset = UTF-8過期時間:-1}
當我嘗試瀏覽Web瀏覽器中的相應鏈接時出現相同的錯誤。在服務器調試中,此功能的相應入口點未命中。我做錯了什麼?它是GET動詞,所以我應該能夠以任何方式成功訪問它。
最讓我感到困惑的是,這個函數默認包含在每個WEB API項目中,但是我找不到任何引用或者提到人們在實際中如何使用它。
你能解決這個問題嗎? –
關於此問題的簡短摘要是,Visual Studio 2013通過API爲社交登錄生成了無效的代碼,該代碼從未適用於任何人,並且不適合以快速入侵方式修復。解決這個問題的正確方法是使用專用於此功能的單獨的Nuget包。我不記得,一年前我在這種情況下選擇了哪些,但這些是完全成熟的擴展,其中包含數千行代碼以提供所需的行爲。希望能幫助到你。 –