0

認証/認証にIdentityServer3(IdSvr3)を使用しています。サイトBにログインせずに、エンドユーザー(またはリソース所有者:RO)が第2の信頼できるWebサイト(サイトB)にログイン(ログスルー)できる機能を提供したいと考えていますウェブサイト(サイトA)。サイトBは、ROの異なるリソースセットを管理します。 ROがIdSvr3ログイン/同意画面にリダイレクトされないことが重要です。私が今までに見つけたアプローチは、サイトAの内部で、RequestResourceOwnerPasswordAsync(usernameとpasswordを渡してscope = "openid ...")を呼び出してアクセストークンを作成する方法です。このアクセストークンは、ROを認証できるサイトBに送信されます。サイトBは、connect/userinfoエンドポイントを呼び出してユーザー情報を取得します。私はこれが正しいアプローチ/フローであるかどうかを知りたい。 ROはサイトBではなくサイトAに最初に入ると仮定しています。 これについて私に考える時間をとってくれてありがとうございます。既存のログイン画面と信頼できる第2のWebサイトでSSOを適用する方法

+0

オーナーのパスワードの要求とシングルサインオンを要求することができません。あなたのデザインを再考してください。ユーザーがサイトBにログインする必要はなく、トークンを使用してリソースにアクセスする必要がある場合、サイトBはWebApiのように見えます。 – rawel

+0

答えにはrawelありがとうございます。私はサイトBの役割と目的も評価していました。それだけでなく、現在のログインページをカスタマイズしたIdSvr3ログインページに置き換えることをお勧めします。 – Vincent65535

答えて

1

あなたがここでできることは、サイトBスコープのIDサーバーに認証要求を送信し、id_tokenまたは参照トークンを要求することです。プロンプト= noneを使用しているidsrvに許可要求を送信する際に、ユーザーが既にサイトAにログインしている場合に再び同意を示すことなくaccess_tokenを取得するようにしてください。 以下は同じJSファイルから。サイトAでは、このスクリプトファイルを参照し、IIFEを使用してスクリプトを実行できます。

function getIdentityServerURL() { 
    var url = global.appSettings.identityServerURL 
         + "/connect/authorize?client_id=siteB&response_type=id_token token&redirect_uri=" 
         + global.appSettings.siteBUrl + "/Main/SsoCallback&scope=siteBscope openid email roles&prompt=none&nonce=" 
         + genNonce(); 
    return encodeURI(url); 
} 

上記のコードでは、仮想のiframeを作成して認証要求から結果を減少させた後、サイトBに戻ってトークンを投稿することができSsoCallbackページにリダイレクトされます。以下のコードを参照してください。

<script type="text/javascript"> 
var identityresult = window.location.hash.split('&').reduce(function (result, item) { 
    var parts = item.split('='); 
    result[parts[0]] = parts[1]; 
    return result; 
}, {}); 

window.parent.postMessage(identityresult, '*'); 

スクリプトがイベントをのpostMessageを聞くことができます。お役に立てれば。

関連する問題