访问令牌和刷新令牌到期时如何重定向到登录页面

时间:2018-11-14 09:11:06

标签: asp.net-core-2.0 identityserver4

嗨,我的previous question之后,如果访问和刷新令牌已过期,我需要将用户重新定向到登录页面。问题是我不知道如何在不进行硬编码的情况下获取登录页面的地址。

    public async Task<ActionResult> Shouts()
    {
        var authServerInfo = await this.GetAuthenticationServerInfo();
        var accessToken = await HttpContext.GetTokenAsync("access_token");

        var tokenClient = new TokenClient(authServerInfo.TokenEndpoint, "AuthTest_Code", "secret");
        using (var client = new HttpClient())
        {
            client.SetBearerToken(accessToken);
            var content = await client.GetStringAsync("http://localhost:5002/api/Values/Get");
            var data = JsonConvert.DeserializeObject<List<String>>(content);
            return View("Shouts", data);
        }            
    }

2 个答案:

答案 0 :(得分:0)

您可以将其作为设置添加到appsettings.json文件中。

我在此文件中存储了多个ADFS设置。如下所示:

{
    "PublicUrl": "BASE_URL_HERE",
    "ConnectionStrings": {
        //Connection strings here
    },
    "ApplicationInsights": {
        "InstrumentationKey": "APPINSIGHTS_INSTRUMENTATIONKEY_HERE"
    },
    "Logging": {
        "IncludeScopes": false,
        "LogLevel": {
            "Default": "Error",
            "Microsoft": "Warning",
            "Roxit": "Warning"
        }
    },
    "Authentication": {
        "AdfsBaseUrl": "ADFS_BASEURL_HERE",
        "AdfsLogout": "ADFS_LOGOUT_URL_HERE",
        "AdfsLogin": "ADFS_LOGIN_URL_HERE",
    }
}

您可以看到我有一个注销和登录URL。如何在您的代码中检索这些配置设置,您可以在这里阅读:How to read AppSettings values from Config.json in ASP.NET Core

答案 1 :(得分:0)

在ASP.Net中,通常可以让Cookie身份验证中间件处理此问题-即,如果您执行HttpContext.SignOut("...my cookie scheme...")或Cookie过期,则对安全操作的下一个请求将自动重定向到与该计划。

还值得注意的是,OpenID Connect的目的是使客户端Web应用程序的会话/身份验证cookie生存期与IDP会话的生存期保持一致,而不是与access_token的生存期(通常要短得多)保持一致(并在这样的服务器端应用程序中使用刷新令牌静默更新)。

在此处查看会话管理可选规范:

https://openid.net/specs/openid-connect-session-1_0.html

您当然可以自由定义自己的规则,以规定客户端的最终用户必须进行身份验证的频率。您可以使用max_ageprompt=login授权端点参数来强制进行交互式身份验证,然后在客户端应用程序中检查auth_time声明以验证该用户确实是最近经过身份验证的。

要使用普通的.Net Core 1.1中间件传递其他参数,它可能看起来如下所示(2.x可能略有不同):

//Initialising OpenIdConnectEvents...
OnRedirectToIdentityProvider = context => {
    //context.Properties is of type AuthenticationProperties which can be passed via the Challenge() method.
    if(context.Properties.Items.ContainsKey("prompt"))
        context.ProtocolMessage.Prompt = context.Properties.Items["prompt"];
}