使用ASP.NET核心和服务堆栈进行身份验证和授权

时间:2017-07-10 05:36:10

标签: authentication asp.net-core servicestack identityserver4

我有一个ASP.Net核心MVC Web应用程序,用户需要登录才能从IdentityServer4获取id_token,然后将id_token传递给ServiceStack中实现的webapi以获取授权代码。随后对webapi的调用将使用授权码。

到目前为止,我所读到的是Web App,它应该使用openid cookie令牌(UseOpenIdConnectAuthentication)。对于webapi,它应该使用持票令牌。我的问题是如何将来自客户端浏览器的仅http cookie令牌作为http标头中的承载令牌传递。由于cookie仅为http,因此无法通过Javascript访问。此外,ASP.NET Core cookie中间件加密cookie,ServiceStack webapi可以解密加密的cookie(如果cookie传递给webapi)吗?

我是朝着正确的方向前进的吗?欢迎提出任何建议。

由于

2 个答案:

答案 0 :(得分:2)

您可以在此处找到您的方案示例:https://identityserver4.readthedocs.io/en/release/quickstarts/5_hybrid_and_api_access.html

授权代码仅用于从身份服务器获取访问令牌,不用于对API进行身份验证。

以下是 流的工作方式:

  1. 用户登录Identity Server
  2. 您的MVC应用获取授权码和ID令牌
    • id令牌告诉您的MVC应用用户
  3. 授权代码与API的身份服务器交换访问令牌和刷新令牌
  4. 现在,MVC应用程序可以使用访问令牌
  5. 从其后端进行HTTP调用
  6. 创建身份验证cookie并将其返回给用户
  7. 前端向MVC后端提交每个请求的身份验证cookie,该后端会自动验证每个请求到MVC的请求,然后当您想从那里调用API时,按照文档中的说明获取它,并将其附加到您的请求

答案 1 :(得分:0)

我认为您在此处缺少的一点是,一旦用户登录,当您重新登陆客户端应用程序时,您将在响应中获得访问令牌。如果您使用的是Hybrid Flow,请在客户端应用中将其配置为

app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
{
    AuthenticationScheme = "oidc",
    SignInScheme = "Cookies",

    Authority = "http://localhost:5000",
    RequireHttpsMetadata = false,

    ClientId = "mvc",
    ClientSecret = "secret",

    ResponseType = "code id_token",
    Scope = { "api1", "offline_access" },

    GetClaimsFromUserInfoEndpoint = true,
    SaveTokens = true
}); 

请参阅我们要求代码的 ResponseType ,即访问代码。所以你不需要再打电话或登录。一旦你想打电话给你的api,就得到像

这样的令牌
var access_token = await HttpContext.Authentication.GetTokenAsync("access_token");

// call api
var client = new HttpClient();
client.SetBearerToken(access_token);

var response = await client.GetAsync("http://localhost:5001/identity");
if (!response.IsSuccessStatusCode)
{
    Console.WriteLine(response.StatusCode);
}
else
{
    var content = await response.Content.ReadAsStringAsync();
    Console.WriteLine(JArray.Parse(content));
}

如果您使用Implicit流,您的前端可以使用oidc-client库获取访问令牌,而user.access_token将拥有它。