使用带有身份服务器 4 的 oidc 客户端进行静默登录

Posted

技术标签:

【中文标题】使用带有身份服务器 4 的 oidc 客户端进行静默登录【英文标题】:silent sign in using oidc client with identity server 4 【发布时间】:2017-05-26 06:33:20 【问题描述】:

我正在尝试在 oidc-client 中实现静默登录以与 Angular 2 一起使用

如何使用 oidc 客户端静默检查用户是否已登录(idsvr4)并显示登录详细信息。

以下代码有效,但我需要刷新页面

idsvr 4 客户端

  // javascript Client
            new Client
            
                ClientId = "js",
                ClientName = "JavaScript Client",
                AllowedGrantTypes = GrantTypes.Implicit,
                AllowAccessTokensViaBrowser = true,


                RedirectUris =  "http://localhost:5002/callback.html" ,

                PostLogoutRedirectUris =  "http://localhost:5002/index.html" ,
                AllowedCorsOrigins =  "http://localhost:5002" ,

                AllowedScopes =
                
                    IdentityServerConstants.StandardScopes.OpenId,
                    IdentityServerConstants.StandardScopes.Profile,
                    "api1",

                ,
                    RequireConsent=false,
                AllowOfflineAccess = true
            

客户端代码

    var config = 
     authority: "http://localhost:5000",
    client_id: "js",
    redirect_uri: "http://localhost:5002/callback.html",
    silent_redirect_uri: "http://localhost:5002/callback.html",
    response_type: "id_token token",
    scope: "openid profile api1 offline_access",
    post_logout_redirect_uri: "http://localhost:5002/index.html",



    // Number of seconds before the token expires to trigger
    // the `tokenExpiring` event
    accessTokenExpiringNotificationTime: 4,

    // Do we want to renew the access token automatically when it's
    // about to expire?
    automaticSilentRenew: false,
   
    // Do we want to filter OIDC protocal-specific claims from the response?
    filterProtocolClaims: false,

    // use localStorage
    userStore: new Oidc.WebStorageStateStore( store: window.localStorage )
    ;
    var mgr = new Oidc.UserManager(config);


    // You can hook a logger to the library.
    // Conveniently, the methods exposed by the logger match
     // the `console` object
    Oidc.Log.logger = console;

    // When a user logs in successfully or a token is renewed, the `userLoaded`
    // event is fired. the `addUserLoaded` method allows to register a callback to
    // that event
    mgr.events.addUserLoaded(function (loadedUser) 
    console.log("$$$$$$$$$$$$$$$$$$$$$$$ added");
    );

    // Same mechanism for when the automatic renewal of a token fails
    mgr.events.addSilentRenewError(function (error) 
    console.error('$$$$$$$$$$$$$$$$$$$$$$$ error while renewing the access    token', error);
    );

    // When the automatic session management feature detects a change in
    // the user session state, the `userSignedOut` event is fired.
    mgr.events.addUserSignedOut(function () 
    alert('The user has signed out');
    );

    mgr.getUser().then(function (user) 
    if (user) 
        log("User logged in", user.profile);
    
    else 
        log("User not logged in");
       // log("*****************************************************");
        mgr.signinSilent()
        .then(function (newUser) 
            console.log("doneeeeeeeeeeeeeeeeeeeee");
            console.log(newUser);
            console.log(newUser.profile);
        ).catch(function (e) 
            console.log("========  " + e);
        );;
        mgr.signinSilentCallback().then(function (newUser) 
        console.log("doneeeeeeeeeeeeeeeeeeeee");
        console.log(newUser);
        console.log(newUser.profile);
    ).catch(function (e) 
            console.log("&&&&&&&&&&&&  "+e);
        );

    


    );

silentSignIn 的任何一种方法都没有返回用户

我想获取用户是否登录并在客户端打开后立即检索信息。

或者如果在 Angular 2 中有更好的方法来做到这一点,那就更好了。

【问题讨论】:

我遇到了类似的问题。你查到真相了吗? 您将如何使用automaticSilentRenew: true 完成此任务? 我也有同样的问题,在进行 SilenceRenew 时,有时 API 返回 401 并且我的应用程序“重新加载”页面 在 devtools 中,您的控制台是否显示任何错误? 【参考方案1】:

我遇到了同样的问题。我设法通过使用以下 signin() 方法并通过管理进程登录响应来解决它:

function signin() 
    manager.createSigninRequest().then(function (req) 
        window.location = req.url;
    ).catch(function (err) 
        log(err);
    );



manager.processSigninResponse().then(function (response) 
    log("signin response success", response);
).catch(function (err) 

);

manager.events.addUserLoaded(function (user) 
    manager.getUser().then(function () 
        log("User logged in", user.profile);
    );
);



function api() 
      mgr.getUser().then(function (user) 
    var url = "http://localhost:5001/identity";

    var xhr = new XMLHttpRequest();
    xhr.open("GET", url);
    xhr.onload = function () 
        log(xhr.status, JSON.parse(xhr.responseText));
    
    xhr.setRequestHeader("Authorization", "Bearer " + idToken);
    xhr.send();
       );

【讨论】:

以上是关于使用带有身份服务器 4 的 oidc 客户端进行静默登录的主要内容,如果未能解决你的问题,请参考以下文章

继续与 OIDC JS 客户端和身份服务器进行会话 4 授权流与 Azure 应用服务上的 PKCE 流

Identity Server 4 - 检查 iframe 会话问题 - oidc 客户端

在 IdentityServer4 和 Dotnet Core Identity 中使用带有身份验证 (oidc) 的 sms otp

使用oidc的JWT使用不同数量的客户端进行身份验证

没有用户使用身份服务器和javascript的oidc客户端登录SilentCallback

如何使用 OIDC (vuejs + nodejs) 对前端和后端进行身份验证?