【问题标题】:Retrieving Claims in OIDC and MVC在 OIDC 和 MVC 中检索声明
【发布时间】:2018-08-01 20:28:11
【问题描述】:

我有一个控制器,代码如下:

        if (!Request.IsAuthenticated)
        {
            HttpContext.GetOwinContext().Authentication.Challenge(OpenIdConnectAuthenticationDefaults.AuthenticationType);
        }

在我的 Startup.Auth.cs 中,我有以下内容:

app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions()
        {
            ClientId = "",
            ClientSecret = "",
            Scope = "openid email profile",
            ResponseType = "id_token",
            Authority = String.Format(CultureInfo.InvariantCulture, IdpInstance, "common", "/v2.0"),
            RedirectUri = "https://localhost/abcdeg.ClaimsAdapter.WebApp/Oidc/Authenticate",
            CallbackPath = new PathString("/"),
            TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuer = false,
            },
            Notifications = new OpenIdConnectAuthenticationNotifications
            {
                AuthorizationCodeReceived = OnAuthorization,
                SecurityTokenValidated = OnTokenValidate,
                AuthenticationFailed = OnAuthenticationFailed,
                RedirectToIdentityProvider = OnRedirectToIdentityProvider
            },

        });

我假设,在 OnTokenValidate 内,我应该得到我的声明。如果是这样,我将如何去做。我知道我有一个 SecurityTokenValidatedNotification,但该对象的任何方法或成员似乎都没有公开与声明相关的任何内容。我需要以某种方式存储这些声明,以便我可以在我的控制器上检索它。

【问题讨论】:

    标签: owin openid-connect


    【解决方案1】:

    通常对于服务器端 Web 应用程序,上述 Microsoft 库将默认使用在 id 令牌中返回的声明。这些声明源自您的授权服务器。

    自定义逻辑的地方是在 AuthorizationCodeReceived 处理程序期间。通常你会:

    • 创建新的身份验证票证
    • 自定义声明
    • 然后声明将被序列化为您的身份验证 cookie
    • 对应用程序的每个后续请求都会反序列化 cookie

    常见的事情有:

    • 将刷新令牌添加到您的声明中
    • 从 id 令牌外部添加其他声明
    • 也许添加您从数据库或其他 API 读取的声明

    这里有一些示例代码可以帮助您入门: https://github.com/IdentityServer/IdentityServer3/issues/2457

    【讨论】:

    • 嗨,加里,感谢您的回复!我想知道是否应该使用 AuthorizationCodeReceived 有两个原因。 1. responseType 是 id_token,所以它使用的是隐式工作流,所以我想知道在这种情况下是否甚至调用了 authorizationCodeReceived。 2. 实际上,我已经尝试在其中添加示例代码,但在查看声明时仍然遇到问题。我正在尝试访问 ReturnUri 中指示的 url 中的声明……知道该怎么做吗? ClaimsPrincipal 由于某种原因根本不显示声明
    • 嘿,加里,你看到了吗? github.com/Azure-Samples/…
    【解决方案2】:

    啊——我明白了:

    设计考虑

    • 通常,MS 库是为服务器端授权代码流设计的,您使用 response type = 'code id_token'
    • 隐式流程改为使用“token id_token”,我认为上述库不支持该流程
    • 此外,如果您需要在登录后调用 API,则需要获取“代码”,以便随后获取访问令牌

    UPSHOT:如果使用上述库,我建议使用“code id_token” - 它可能会解决您的问题。

    通过网络返回什么?

    你能看到 id 令牌中返回的内容(通过Online JWT viewer)吗?这应该是您的声明的来源。

    隐式流

    这是在 UI 中的 Javascript 代码中实现的,而不是在服务器端代码中。在我正在写的基于教程的博客上有一些关于此的内容:

    【讨论】:

    • 似乎owin提供了很多库。我只是不知道如何使用它们。与 AuthorizationCodeReceived 一样,它似乎仅在您使用 [Authorized] 属性时才被调用。如果您执行常规 HttpContext.GetOwinContext().Authentication.Challenge(OpenIdConnectAuthenticationDefaults.AuthenticationType);,它将不会被调用
    猜你喜欢
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 2022-01-08
    相关资源
    最近更新 更多