Как перенаправить на страницу входа при истечении срока действия токена и обновлении токена - PullRequest
0 голосов
/ 14 ноября 2018

Привет Исходя из моего предыдущего вопроса Мне нужно перенаправить пользователя на страницу входа в систему, если токен доступа и обновления истек. Проблема в том, что я не знаю, как получить адрес страницы входа без жесткого кодирования.

    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 голосов
/ 14 ноября 2018

В ASP.Net вы обычно позволяете промежуточному программному обеспечению для проверки подлинности файлов cookie это обрабатывать, т.е. если вы делаете HttpContext.SignOut("...my cookie scheme...") или срок действия файла cookie истекает, то следующий запрос к защищенному действию будет автоматически перенаправляться на URL-адрес входа в систему, связанный с этой схемой. .

Стоит также отметить, что намерение OpenID Connect состоит в том, чтобы вы выровняли время жизни файла cookie сеанса / аутентификации вашего клиентского веб-приложения с временем сеанса IDP, а НЕ со временем жизни access_token, который обычно был бы намного короче. (и обновляется в режиме без вывода сообщений с использованием токена обновления в серверном приложении, подобном этому).

Ознакомьтесь с дополнительной спецификацией управления сеансом здесь:

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

Вы, конечно, можете сами определять, как часто конечный пользователь вашего клиента должен проходить аутентификацию. Вы можете использовать аргументы max_age или prompt=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"];
}
0 голосов
/ 14 ноября 2018

Вы можете добавить его в качестве параметра в файл 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 для входа.Как получить эти параметры конфигурации в вашем коде, вы можете прочитать здесь: Как прочитать значения AppSettings из Config.json в ASP.NET Core

...