【问题标题】:Using IdentityServer3 with Single Page App (UseIdentityServerBearerTokenAuthentication)将 IdentityServer3 与单页应用程序一起使用 (UseIdentityServerBearerTokenAuthentication)
【发布时间】:2016-02-01 03:52:19
【问题描述】:

背景

我正在使用这些技术来保护 WebApi 应用程序:

  • ThinkTecture.IdentityServer3
  • OWIN(天蓝色)
  • 单页应用 - javascript 客户端
  • 请参阅简单 OAuth2 演练示例 (github)

在上面的示例中,.NET 控制台应用程序客户端从 IdentityServer 请求令牌并使用它来访问 WebApi 应用程序。这在示例中运行良好。

我想将 .NET 控制台应用程序客户端更改为 javascript 单页应用程序客户端。我尝试添加一个代理登录控制器,它代表 javsacript 客户端向 IdentityServer 发出请求,并将令牌在 cookie 中返回给客户端。

代码

[HttpPost]
[Route("login")]
public HttpResponseMessage Login(LoginRequest request) // Proxy to IdentityServer3
{

    var tokenClient = new TokenClient(
            "https://localhost:44333/connect/token",
            "javascript client",
            "client secret");

    var tokenResponse = _tokenClient.RequestResourceOwnerPasswordAsync(request.username, request.password, "api1").Result;

    var cookie = new CookieHeaderValue("access_token", tokenResponse.AccessToken);
    cookie.Expires = DateTimeOffset.Now.AddDays(1);
    cookie.Domain = "localhost";
    cookie.Path = "/";            
    var response = new HttpResponseMessage();
    response.Headers.AddCookies(new CookieHeaderValue[] { cookie });
    return response;
}

我在 javascript 客户端中成功获取了访问令牌,但是 API 无法识别它。

问题

我应该如何将 IdentityServer 生成的令牌传递给 javascript 应用程序,以及如何使用它来访问 WebApi?

【问题讨论】:

  • Js 应用程序宁愿她使用隐式流。检查文档和示例。

标签: javascript azure asp.net-web-api identityserver3


【解决方案1】:

假设您的令牌端点是“https://localhost:44333/connect/token”(正如您所提到的)。使用带有如下正文的 POST 请求访问该端点将返回一个令牌:

grant_type=password&client_id=youtclientid&client_secret=yourclientsecret&username=yourUserName&password=YourPassword&scope=list_of_requested_scopes

您使用 JS 变量来存储令牌,然后为了使用该令牌访问受保护的 API,您必须将其作为请求标头的一部分发送,类似于以下内容:在您的请求标头中,你将拥有:

Authorization: Bearer eyJ0eXAiOiJKV...

其中“eyJ0eXAiOiJKV...”是您在第一步中收到的令牌。

【讨论】:

  • 为什么?我的意思是,如果您使用的是 https...?
  • https 保护连接免受中间人攻击。它可以使连接安全而不是终端系统。设计令牌的重点是避免密码四处飘荡。这只是我的观点。
  • 非常感谢您的意见,我正在努力学习 :) 但是如果您使用刷新令牌,您只会发送一次密码,然后继续使用刷新令牌来扩展您的会话,对吧?即使您使用隐式流程,您仍然会“一次”发送密码。顺便问一下,你有什么建议呢?
  • 我只会输入答案。格式化更容易
【解决方案2】:

使用 oidc-client.js 或在这些行上创建类似的东西,因为这个 js 库的大小很大。

查看此链接。 https://github.com/IdentityModel/oidc-client-js/tree/master/sample

还有视频 https://vimeo.com/131636653

我们正在使用 IdentityServer 基础架构进行初始登录,然后使用令牌 ID/访问权限进行所有进一步的通信。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 2012-12-29
    • 1970-01-01
    • 2018-10-21
    相关资源
    最近更新 更多