2

在 IdentityServer 3 中,我使用SecurityTokenValidatedNotifications 上的事件来建立我自己的带有名称和声明的身份。例如,我access_token使用这样的资源所有者工作流程存储以供以后访问 n API:

app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
AuthenticationType = "oidc",

// ...

Notifications = new OpenIdConnectAuthenticationNotifications
{
    SecurityTokenValidated = async n =>
    {
        var nid = new ClaimsIdentity(
          n.AuthenticationTicket.Identity.AuthenticationType,
          "name",
          ClaimTypes.Role);
        nid.AddClaim(new Claim("id_token", n.ProtocolMessage.IdToken));
        nid.AddClaim(new Claim("access_token", n.ProtocolMessage.AccessToken));
        nid.AddClaim(new Claim("expires_at", DateTimeOffset.Now.AddSeconds(int.Parse(n.ProtocolMessage.ExpiresIn)).ToString()));
    }
}
}

在 ASP.NET Core 的 IdentityServer 4 中,不是 Notifications 属性。我可以看到自动生成了很多声明,但我没有得到,access_token也没有自动设置身份的用户名

我当前在 ASP.NET Core 中的客户端配置如下所示

   app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
        {
            AuthenticationScheme = "oidc",
            SignInScheme = "Cookies",
            Authority = identityServerUri,
            RequireHttpsMetadata = false,
            ClientId = clientId,
            ResponseType = "id_token token",
            Scope =
            {
                "openid profile email warehouseapi"
            },
            GetClaimsFromUserInfoEndpoint = true,
            SaveTokens = true,
            AutomaticAuthenticate = true,
            AutomaticChallenge = true,
        });

IdentityServer 4 中的预期方式是什么?

4

2 回答 2

2

这实际上与 IdentityServer4 无关。OWIN 和 AspNetCore 变体中的身份验证中间件之间的差异更大。

这些通知现在更正确地命名Events

您可以使用以下方法执行类似操作:

app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
{
    AuthenticationScheme = "oidc",
    SignInScheme = "Cookies",

    Authority = "https://demo.identityserver.io",
    PostLogoutRedirectUri = "http://localhost:3308/",
    ClientId = "hybrid",
    ClientSecret = "secret",
    ResponseType = "code id_token",
    GetClaimsFromUserInfoEndpoint = true,
    SaveTokens = true,

    Events = new OpenIdConnectEvents
    {
        OnTokenValidated = async n =>
        {

        }
    }
});

您可以在这里找到所有精彩的活动。

于 2016-10-18T16:56:49.833 回答
2

您可以使用TickedReceived事件来转换声明:

        var oidcOptions = new OpenIdConnectOptions
        {
            ...
            Events = new OpenIdConnectEvents()
            {
                // get access token
                OnTicketReceived = ctx =>
                {
                    // transform claims
                    var access_token = ctx.Ticket.Properties.GetTokenValue("access_token");
                    return Task.FromResult(0);
                }
            }
        };

此外,您不需要将令牌保存为声明,因为当您设置SaveTokens为 true 时,令牌会自动保存在身份验证属性中。要获得令牌,您可以使用HttpContext.Authentication.GetTokenAsync("<token name>").

于 2016-10-18T17:24:15.047 回答