如何通过IdentityServer3登录后将用户重定向到原始页面

时间:2016-09-16 18:14:15

标签: openid identityserver3

我的问题Get redirect link from client in IdentityServer3 login page中描述的要求非常相似。 当用户(未登录)打开任何特定客户端应用程序页面(例如,从书签)或会话过期,并且用户刷新特定页面或执行某些操作时,他/她将被重定向到IdentityServer3的登录页面。

但我很困惑如何实现原始页面记住,并且用户被重定向回最初打开的应用程序页面而不是应用程序根目录(在idsrv3和OIDC中配置为静态重定向URL)中间件)。

有人可以指导我是否有可能以及如何做到这一点?

到目前为止我的假设:

  1. 原来打开的页面应该以某种方式传递给idsrv3登录页面,例如,作为一些重定向url查询字符串参数。为了做到这一点,可能需要调整/扩展OIDC中间件吗?
  2. Idsrv3应该支持重定向网址,或者应该可以以某种方式配置/扩展它以支持重定向网址。
  3. 如果idsrv3不完全支持此类重定向,则可能需要实现自定义redirectUri验证器以传递redirectUri验证(这是唯一明确的部分)。 能
  4. 我的客户端应用程序基于Angular 1.X,WebApi 2,OWIN并配置了三个中间件:UseCookieAuthentication,UserIdentityServerBearerTokenAuthentication和UseOpenIdConnectAuthentication,非常标准设置。应用程序是IdentityManager的一个分支,有一些修改。

1 个答案:

答案 0 :(得分:2)

所以,我相信你有两个场景:

  1. 用户在匿名允许的页面上,然后单击“登录”。
  2. 用户导航/或输入需要身份验证的网址。
  3. 1挑战

    如果您想挑战:(用户在不需要身份验证的页面上,并单击登录按钮),您可以将当前页面传递给OIDC中间件,如下所示:

    public void ActionResult Login(string redirecturi)
    {
        var props = new AuthenticationProperties { RedirectUri = redirecturi };
        HttpContext.Current.GetOwinContext().Authorization.Challenge(props);
    }
    

    2直接导航

    如果用户直接转到需要验证的网址,则 所需要的只是使用正常的[Authorize]属性来装饰它。

    背景:

    看到一个人不能(或者不想)将auth下的每个页面添加到身份提供者的redirect_uri的接受列表中,Microsoft会使用OIDC将其添加为sigininsession的元数据{ {1}}参数。你不可能直接看到它,因为它会在内部对你传递的所有东西进行urlencoded编辑(参见state)。