2017-10-15 103 views
1

我試圖創建Facebook,谷歌和linkedin的外部登錄方案,而不使用身份框架。我有一個存儲所有用戶的API,並執行一些身份驗證。現在我對如何從外部登錄獲取信息感到迷茫。不使用身份的外部登錄asp.net核心2.0

我發出這樣的挑戰。

[HttpPost] 
[ValidateAntiForgeryToken] 
public IActionResult ExternalLogin(string provider) 
{ 
    //Issue a challenge to external login middleware to trigger sign in process 
    return new ChallengeResult(provider); 
} 

這很好用,它將我重定向到google,facebook或linkedinn身份驗證。

現就本次部分:

public async Task<IActionResult> ExternalLoginCallback() 
{ 
    //Extract info from externa; login 

    return Redirect("/"); 
} 

所有我想要的是讓,是由外部登錄提供的信息。

我已經試過我從我的研究發現,

var result = await HttpContext.AuthenticateAsync(provider); 
if (result?.Succeeded != true) 
{ 
    return Redirect("/"); 
} 
var externalUser = result.Principal; 
var claims = externalUser.Claims.ToList(); 

所有我我不知道如果我的回調字符串的簡單?provider=Google將通過提供者的名稱首先我指定的,因此它可以被用來檢查登錄方案。我想這是不正確的。其次,我試圖編碼await HttpContext.AuthenticateAsync("Google"),當它到達這個代碼時,調試停止。我不知道爲什麼。

我在使用單一認證創建項目時看到了生成的代碼。

var info = await _signInManager.GetExternalLoginInfoAsync(); 

不幸的是,我無法使用身份,因爲我沒有用戶存儲,我的應用程序將使用API​​。

+0

嘿你有沒有找到解決的辦法?找不到任何文檔或示例,說明如何在沒有asp.net標識的情況下做到這一點... :( – Reft

回答

2

首先你需要創建一個自定義的cookie處理程序。我自己有問題:

No IAuthenticationSignInHandler is configured to handle sign in for the scheme: Bearer

我不得不添加一個cookie處理程序,暫時存儲外部身份驗證的結果,例如,由外部提供商發送的索賠。這是必要的,因爲在完成外部認證過程之前,通常會涉及幾個重定向。

啓動

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(o => 
{ 
    o.TokenValidationParameters = tokenValidationParameters; 
}) 
.AddCookie("YourCustomScheme") 
.AddGoogle(googleOptions => 
{ 
    googleOptions.SignInScheme = "YourCustomScheme"; 
    googleOptions.ClientId = "x";//Configuration["Authentication:Google:ClientId"]; 
    googleOptions.ClientSecret = "x";//Configuration["Authentication:Google:ClientSecret"]; 
    //googleOptions.CallbackPath = "/api/authentication/externalauthentication/signin-google"; 
}); 

的重要組成部分,這裏是 「YourCustomScheme」。

現在是時候從回調操作中的外部驗證提供的索賠中檢索用戶信息。

控制器

[AllowAnonymous] 
[HttpPost(nameof(ExternalLogin))] 
public IActionResult ExternalLogin(ExternalLoginModel model) 
{ 
    if (model == null || !ModelState.IsValid) 
    { 
     return null; 
    } 

    var properties = new AuthenticationProperties { RedirectUri = _authenticationAppSettings.External.RedirectUri }; 

    return Challenge(properties, model.Provider); 
} 

[AllowAnonymous] 
[HttpGet(nameof(ExternalLoginCallback))] 
public async Task<IActionResult> ExternalLoginCallback(string returnUrl = null, string remoteError = null) 
{ 
    //Here we can retrieve the claims 
    var result = await HttpContext.AuthenticateAsync("YourCustomScheme"); 

    return null; 
} 

瞧!我們現在有一些用戶信息可以使用!

enter image description here

有用的鏈接

http://docs.identityserver.io/en/release/topics/signin_external_providers.html

+0

)嗨,我遵循了你所做的一切,昨天我做了,但一段時間後,我總是得到錯誤:「異常:OAuth令牌端點失敗:狀態:BadRequest;頭部:緩存控制:無存儲」,如果我調試它的方法就像ljpv14在主文章ExternalLogin中顯示的那樣。在我返回新的ChallengeResult(「Facebook」)後,它只是進入一個循環,爲什麼會發生? – taiko

+0

如果我在該方法中放置了「var result = await HttpContext.AuthenticateAsync(」YourCustomScheme「);」 – taiko

+0

你有兩個動作,ExternalLogIn和ExternalLoginCallback嗎?你應該在第一個返回challenge並且在第二個返回數據,(with httpcontext.authenticateasync)。對不起,我沒有前經歷這些問題,我們來看看ljpv14說了些什麼,如果他有同樣的問題,那麼也許他可以提供一些代碼。 此外,這個鏈接可能會讓你更好地瞭解它是如何工作的,它爲我做了。 http://docs.identityserver.io/en/release/topics/signin_external_providers.html – Reft

-2

我也有這個問題,看看下面的代碼是否適合你。 我想在Google/FB身份驗證後提取全名。

var info = await _signInManager.GetExternalLoginInfoAsync(); 

TempData["fullname"] = info.Principal.FindFirstValue(ClaimTypes.Name);