2017-10-15 12 views
1

アイデンティティフレームワークを使用せずに、facebook、google、およびlinkedinの外部ログイン方式を作成しようとしています。私はすべてのユーザーを格納し、いくつかの認証を行うapiを持っています。今、私は、外部ログインから情報を取得する方法には迷っています。アイデンティティを使用しない外部ログインasp.net core 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、またはリンクイン認証のいずれかにリダイレクトされます。この部分に今

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を使用しているためIDを使用できません。

+0

ねえ、あなたは今までに解決策を見つけましたか?あなたがasp.netのアイデンティティなしでこれを行う方法に関する文書や例を見つけることができません... :( – Reft

答えて

2

まず、カスタムのCookieハンドラを作成する必要があります。私は自分自身に問題がありました:

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

外部認証の結果を一時的に保存するクッキーハンドラを追加する必要がありました。外部プロバイダから送信された申し立て通常、外部認証プロセスを完了するまで、数回のリダイレクトが行われるため、これは必要です。

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;ヘッダー:Cache-Control:no-store"もしljpv14がメイン投稿のExternalLoginに表示されているような方法にデバッグすればよい。 – taiko

+0

"var result = HttpContext.AuthenticateAsync(" YourCustomScheme ");"という行をメソッドに挿入すると、新しいChallengeResult( "Facebook")が返された後、 – taiko

+0

ExternalLogInとExternalLoginCallbackの両方の操作をしていますか?最初にチャレンジを返し、2番目のチャレンジを返す必要があります(2番目のチャットを返す必要があります)。 httpcontext.authenticateasync)。申し訳ありませんがexこれらの問題を克服し、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); 
関連する問題