2016-11-08 67 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处理中排除。 –