2016-11-08 94 views
2

我已經使用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項目中,但是我找不到任何引用或者提到人們在實際中如何使用它。

+0

你能解決這個問題嗎? –

+0

關於此問題的簡短摘要是,Visual Studio 2013通過API爲社交登錄生成了無效的代碼,該代碼從未適用於任何人,並且不適合以快速入侵方式修復。解決這個問題的正確方法是使用專用於此功能的單獨的Nuget包。我不記得,一年前我在這種情況下選擇了哪些,但這些是完全成熟的擴展,其中包含數千行代碼以提供所需的行爲。希望能幫助到你。 –

回答

0

由於您正在使用其中一個模板,因此我假設您的項目使用派生的OAuthAuthorizationServerProvider以及多個重寫的方法。在這些中放棄一些斷點,因爲這可能是失敗的原因。

+0

謝謝你的建議。如果方法被標記爲[AllowAnonymous]和[OverrideAuthentication],OAuthAuthorizationServerProvider如何與此相關?如果我理解正確,它會將其從標準OAuth處理中排除。 –