填充的用户中没有访问令牌(声明)

时间:2018-06-21 07:35:41

标签: c# asp.net-mvc oauth identityserver4 identityserver3

我们将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中缺少的一种选择,但是哪个呢?

2 个答案:

答案 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,                
        };

然后可以根据用户原则索取访问令牌。