Identityserver4 API返回身份验证失败时重定向到登录

Identityserver4 API返回身份验证失败时重定向到登录,identityserver4,Identityserver4,我有一个带有IdentityServer4的设置和一个作为同一个项目一起运行的API,还有一个MVC客户端。这可以正常工作,但在某个时候客户端调用API并返回身份验证错误(401),因为访问令牌不知何故变得无效。在这个场景中,我希望客户端调用服务器上的登录页面,以便用户可以重新输入他们的凭据,然后重定向回客户端 string accessToken = await HttpContext.Authentication.GetTokenAsync("access_token"); using (H

我有一个带有IdentityServer4的设置和一个作为同一个项目一起运行的API,还有一个MVC客户端。这可以正常工作,但在某个时候客户端调用API并返回身份验证错误(401),因为访问令牌不知何故变得无效。在这个场景中,我希望客户端调用服务器上的登录页面,以便用户可以重新输入他们的凭据,然后重定向回客户端

string accessToken = await HttpContext.Authentication.GetTokenAsync("access_token");
using (HttpClient client = new HttpClient())     
    client.SetBearerToken(accessToken);
    HttpResponseMessage response = await client.GetAsync("http://apiserver/method");
    if (response.IsSuccessStatusCode) {

         string content = await response.Content.ReadAsStringAsync();
         forum = JsonConvert.DeserializeObject<Data>(content);
    } else {
         return Redirect(... url to server login with return URL here ...)
    }
}
await HttpContext.Authentication.SignOutAsync("Cookies");
await HttpContext.Authentication.SignOutAsync("oidc");
string accessToken=wait-HttpContext.Authentication.GetTokenAsync(“访问令牌”);
使用(HttpClient=new HttpClient())
client.SetBearerToken(accessToken);
HttpResponseMessage response=await client.GetAsync(“http://apiserver/method");
if(响应。IsSuccessStatusCode){
string content=wait response.content.ReadAsStringAsync();
forum=JsonConvert.DeserializeObject(内容);
}否则{
返回重定向(…指向服务器登录的url,此处返回url…)
}
}
我不清楚如何使用正确的路径和查询生成服务器的url,以便正确地进行身份验证并返回到客户端。我已经浏览了文档和示例,但似乎没有一个解决这个问题


我不清楚如何使用正确的路径和查询生成服务器的url,以便正确地进行身份验证并返回到客户端。我已经浏览了文档和示例,但似乎没有一个能够解决这种情况。

当您从api获得未经授权的访问状态代码401时,您必须首先注销用户。通过将它们注销,它将清除cookies并从oidc中注销它们。这会将应用重定向到您的登录页面,因为客户端上没有可验证的Cookie

string accessToken = await HttpContext.Authentication.GetTokenAsync("access_token");
using (HttpClient client = new HttpClient())     
    client.SetBearerToken(accessToken);
    HttpResponseMessage response = await client.GetAsync("http://apiserver/method");
    if (response.IsSuccessStatusCode) {

         string content = await response.Content.ReadAsStringAsync();
         forum = JsonConvert.DeserializeObject<Data>(content);
    } else {
         return Redirect(... url to server login with return URL here ...)
    }
}
await HttpContext.Authentication.SignOutAsync("Cookies");
await HttpContext.Authentication.SignOutAsync("oidc");

另一种方法是在进行api调用之前检查访问令牌是否已过期。这将为您节省额外的http调用。但这取决于您的应用程序要求。

就是这样。谢谢不明显的是,响应身份验证问题而注销会解决问题,但我没有想清楚。:-)