嗨,我的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);
}
}
答案 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_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"];
}