将IdentityServer3与单页应用程序一起使用(UseIdentityServerBearerTokenAuthentication)

时间:2016-02-01 03:52:19

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

背景

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

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

在上面的示例中,.NET控制台应用程序客户端从IdentityServer请求令牌并使用它来访问WebApi应用程序。这在样本中工作正常。

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

代码

[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?

2 个答案:

答案 0 :(得分:3)

让我们说你的代币终点是" 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,您必须将其作为请求中标题的一部分发送,类似于以下内容:在您的请求中&#39 ; s标题,您将拥有:

Authorization: Bearer eyJ0eXAiOiJKV...

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

答案 1 :(得分:1)

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

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

和视频 https://vimeo.com/131636653

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