2017-07-15 63 views
1

我有一个IdentityServer4和一个作为同一项目和一个MVC客户端一起运行的API的设置。这可以正常工作,但是在某些时候,客户端会调用API,并且会返回验证错误(401),因为访问令牌无法正常工作。在这种情况下,我希望客户端调用服务器上的登录页面,以便用户可以重新输入其凭据,然后重定向回客户端。当API返回认证失败时重定向到登录

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 ...) 
    } 
} 

我不清楚如何生成网址与正确的道路服务器和查询到正确验证,并返回给客户端。我浏览了文档和示例,但似乎没有解决这种情况。

我不清楚如何使用正确的路径和查询来正确地进行身份验证并返回给客户端,从而生成到服务器的URL。我浏览了文档和示例,但似乎没有解决这种情况。

回答

1

当您从api获得未经授权的访问状态代码401时,您必须先将用户注销。通过将它们注销,它将清除cookie并将其从oidc注销。这将重定向应用程序到您的登录页面,因为没有cookie可以在客户端进行身份验证。

await HttpContext.Authentication.SignOutAsync("Cookies"); 
await HttpContext.Authentication.SignOutAsync("oidc"); 

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

+0

就是这样。谢谢!签出响应身份验证问题可以解决问题并不明显,但我没有清楚地思考。 :-) –