来自多个端点的单一访问令牌?

时间:2018-03-14 13:29:42

标签: asp.net-mvc oauth-2.0

我对使用OAuth实施安全性的基本缺乏了解。我看到的所有例子都使用相同的模式,所以我非常自信我的前提是错的,而且这些例子是正确的!

一般来说,我看到它是按照这些方式添加的。

            .AddOAuth("auth", options =>
        {
            options.ClientId = "id";
            options.ClientSecret = "secret";
            options.CallbackPath = new PathString("/signin");
            options.Scope.Add("scope");

            options.AuthorizationEndpoint = "https://.../authorize";
            options.TokenEndpoint = "https://.../token";
            options.UserInformationEndpoint = "https://.../userinfo";

            options.ClaimActions.MapJsonKey(ClaimTypes.NameIdentifier, "id");
            options.ClaimActions.MapJsonKey(ClaimTypes.Name, "name");


            options.Events = new OAuthEvents
            {
                OnCreatingTicket = async context =>
                {
                    var request = new HttpRequestMessage(HttpMethod.Get, context.Options.UserInformationEndpoint);
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                        request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", context.AccessToken);

                    var response = await context.Backchannel.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, context.HttpContext.RequestAborted);
                    response.EnsureSuccessStatusCode();

                    var user = JObject.Parse(await response.Content.ReadAsStringAsync());

                    context.RunClaimActions(user);
                }
            };

现在我的根本误解。我想制作一个演示应用程序,例如,有几个页面显示一些其他api调用的结果。这些调用都需要访问令牌。代码到达OnCreatingTicket后,已获取访问令牌,并用于从UserInformationEndpoint获取数据。但是,我有几个不同的端点,我希望用户可以选择(甚至可能没有" UserInformationEndpoint"对于api我试图调用..)。

所以,我认为我对如何做到这一点有一个虚假的想法。有人能让我转过身来指向正确的方向吗?

编辑,因为评论太长了:

我的要求就是编写一个演示应用,演示如何调用api目录。

为了演示,我想象一个带有一系列链接/按钮的页面,可以将您带到显示不同api调用返回的数据的页面。

在上面的示例中(以及到目前为止我已经看到的所有示例),授权在服务器级别设置并用于检索用户信息。对于我的演示获取用户信息并显示它可能会很好,但它不是最终目标。所有示例都集中在使用toke一次获取用户信息的事实让我感到困惑。我假设(可能不正确)我应该获得一次令牌并从应用程序中的不同点重复使用它。

我很难理解我是否从根本上误解了如何解决这个问题,因为我倾向于想象如果我找到的所有例子都做同样的事情,他们就是正确地做到了。

1 个答案:

答案 0 :(得分:0)

这取决于端点,但我通常获取用户配置文件信息的方式是添加范围。例如,如果您的端点允许访问用户配置文件,则在您的oauth选项中,在对用户进行身份验证时请求该范围:

options.Scope.Add("profile");

这应该可以在端点来回减少流量的情况下完成。

例如,我最近遇到了与Google API相同的问题。我不记得范围的确切名称,但我要求" profile"范围或类似的东西,它发送给我电子邮件,名字和姓氏。当我没有请求此范围时,它只向我发送了用户ID。