我对使用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一次获取用户信息的事实让我感到困惑。我假设(可能不正确)我应该获得一次令牌并从应用程序中的不同点重复使用它。
我很难理解我是否从根本上误解了如何解决这个问题,因为我倾向于想象如果我找到的所有例子都做同样的事情,他们就是正确地做到了。
答案 0 :(得分:0)
这取决于端点,但我通常获取用户配置文件信息的方式是添加范围。例如,如果您的端点允许访问用户配置文件,则在您的oauth选项中,在对用户进行身份验证时请求该范围:
options.Scope.Add("profile");
这应该可以在端点来回减少流量的情况下完成。
例如,我最近遇到了与Google API相同的问题。我不记得范围的确切名称,但我要求" profile"范围或类似的东西,它发送给我电子邮件,名字和姓氏。当我没有请求此范围时,它只向我发送了用户ID。