我们将IdentityServer4用于我们的IdentityServer,并将IdentityServer3用于客户端(ASP.NET MVC 5)。
一切正常(通过OWIN正确设置了用户/声明原则),但我无法从用户那里获得访问令牌。
我们正在使用可以访问以下范围的隐式客户端:openid, profile, testapi
Startup.cs:
app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
{
Authority = identityServerUrl,
RequiredScopes = new[] { "testapi" },
});
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "Cookies",
});
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
Authority = identityServerUrl,
ClientId = "testclient",
Scope = "openid profile testapi",
RedirectUri = "http://localhost:49000/signin-oidc",
ResponseType = "id_token token",
SignInAsAuthenticationType = "Cookies",
});
用于检索访问令牌的代码(在一个控制器内部):
var user = User as ClaimsPrincipal;
var token = user.FindFirst("access_token");
用户设置正确,但令牌为空。我猜这是我在startup.cs中缺少的一种选择,但是哪个呢?
答案 0 :(得分:0)
我找到了一种完全可以实现我想要的解决方案的方法-我将其放在这里供其他遇到问题的人使用。它花费了对IdentityModel的依赖,但是在我的情况下是可以接受的:
在Startup.cs中,我添加了:
Notifications = new OpenIdConnectAuthenticationNotifications
{
AuthorizationCodeReceived = async n =>
{
var tokenClient = new TokenClient(identityServerUrl + "/connect/token", clientId, secret);
var tokenResponse = await tokenClient.RequestAuthorizationCodeAsync(n.Code, n.RedirectUri);
HttpContext.Current.Session[HttpUserContext.ACCESS_TOKEN] = tokenResponse.AccessToken;
}
}
拨打.UseOpenIdConnectAuthentication
答案 1 :(得分:0)
我认为一个更简单的解决方案是使用已经可用的东西:
var options = new IdentityServerBearerTokenAuthenticationOptions
{
Authority = authorityUrl,
PreserveAccessToken = true,
};
然后可以根据用户原则索取访问令牌。