【问题标题】:IdentityServer4 Grant Type for Javascript Client (no UI) access authenticated APIJavascript 客户端(无 UI)访问认证 API 的 IdentityServer4 授权类型
【发布时间】:2020-03-23 08:40:14
【问题描述】:

我有一个使用 Devexpress Javascript 控件的 ASP.Net Core Web 应用程序。

我有一个 [已授权] 的 .Net Core API 项目。 ASP.Net Core Web 应用程序通过授权类型 ClientCredentials 访问 API 项目,传入客户端 ID 和客户端密码以进行身份​​验证。此流程运行良好。

我的问题是 javascript 控件(无 UI 级别身份验证)需要访问 API,并且我不能使用 ClientCredentials 授权类型,因为客户端密码将在 javascript 中可见。

使用什么授权类型?或如何确保 javascript 客户端通过身份验证安全地访问 API?

更新 1: 我正在寻找的是没有 UI 级别身份验证(没有登录屏幕)的 Jasavscript 客户端如何安全地访问私有 API?

【问题讨论】:

  • no UI level authentication 是什么意思?您的 javascript 应用程序可以在浏览器中运行,对吗?
  • UI 级别的身份验证(用户 ID 和密码)由 ASP.Net Coew Web 应用程序完成 - 全部是 C#,使用的授权类型是混合。 javascript 客户端独立于 ASP.Net Core Web 应用程序。
  • 取决于您是否有单页应用程序。通常您对单页应用程序使用隐式授权类型。这里有一个新的建议:auth0.com/blog/oauth2-implicit-grant-and-spa 但我认为你还不需要担心 IMO。如果不是 SPA,那么就像 Ganu 提到的那样混合流——
  • 我认为这个问题具有误导性。您有一个带有 javascript 功能的 ASP.Net Core Web 应用程序 (mvc?)。 没有 UI 级别的身份验证,怎么会有一个单独的 javascript 客户端呢?如果 javascript 不在 iframe 中运行,它是客户端的一部分,应该能够请求现有的访问令牌。您确定您使用客户端凭据来访问 api 吗?由于您也可以使用用户登录后收到的访问令牌,包括刷新令牌逻辑。

标签: javascript asp.net-core identityserver4


【解决方案1】:

您应该在以下情况下使用client_credentials 流:1. 您没有登录的用户上下文(例如服务器到服务器的通信)并且2. 您可以使用反向通道以安全的方式保密。这里的反向通道是指应用程序的后端部分。

如果您的前端使用 ASP.NET Core 在同一个应用程序中工作(即在同一个域或子域中,如 example.comapi.example.com),您可以对域 *.example.com 使用普通 cookie 身份验证。如果它们在不同的域中工作,您应该使用implicit flow。隐式流动没有秘密概念。访问令牌直接作为响应返回。你这里没有后台通道,所以你不能使用秘密。

frontend app web backend api

为避免误解,请观看这​​些视频OAuth 2.0 and OpenID Connect

What I am looking for is how a Jasavscript client with NO UI level authentication (no login screen) can access a private API securely? - 你不能这样做。我想你的代码是在浏览器中执行的,因为你不能使用秘密。您需要基于 cookie 或承载令牌在 Web 后端对 js 客户端进行身份验证。要获得不带秘密的不记名令牌,您可以使用隐式流。如果你的 js 应用和 web 应用共享同一个域,你可以使用 cookie authantiocation。

【讨论】:

  • 您能否分享更多关于如何使用 javascript 客户端以安全方式通过反向通道发送秘密的详细信息?
  • 隐式流不只需要客户端ID吗?因此,如果有人知道客户 ID,他们将能够访问它。不使用隐式流的新建议:scottbrady91.com/Angular/…
【解决方案2】:

我不确定 NO UI level authentication 的含义是什么。如果您的 javascript 客户端想要访问受保护的 api,通常用户将被重定向到 Identity server4 的登录页面以输入您的凭据,javascript 客户端将没有用于身份验证的 UI。

您可以将隐式流或授权代码流与 PKCE 一起使用。第二种是现在推荐的,它提供了识别客户端的密钥而不是客户端密码。

【讨论】:

    【解决方案3】:

    我想我已经正确理解了这个问题。另外,我假设: 1)您是经过身份验证的用户,并在登录后重定向到您的 asp.net 核心应用程序中的 SPA。现在,您需要登录用户的访问令牌。 2) 你的 asp.net 核心本身就是一个身份服务器。

    您可以为此目的使用 [身份服务器工具][1]。 [1]:https://docs.identityserver.io/en/latest/topics/tools.html 这会生成访问令牌。以下是我拥有的示例代码。这是在 Asp.net Core 应用程序的 Account Controller 中。

    [Authorize]
            public async Task<string> Token(string clientId)
            {
                //var client = _configurationDbContext.Clients.Include(x => x.AllowedScopes).SingleOrDefault(x => x.ClientId == clientId);
                var client = Config.GetClients().SingleOrDefault(x => x.ClientId == clientId);
                if (client == null)
                    return null;
    
                var claimsIdentity = _userProfileService.GetUserClaimsIdentity(Convert.ToInt32(User.GetSubjectId()));
    
                var token = await _tools.IssueClientJwtAsync(
                    clientId: clientId,
                    lifetime: 3600,
                    audiences: client.AllowedScopes.Select(x => x).ToArray(),
                    additionalClaims: claimsIdentity.Claims
                    );
    
                return token;
            }
    

    从 javascript 客户端,由于 SPA 是 asp.net 核心网络应用程序的一部分,您可以像这样获取令牌:

    axios.get('/Account/Token?clientId='+'YOUR CLIENT ID HERE').then(resp=>{ 
            token = resp.data;
    });
    

    现在,您可以使用此令牌作为 Bearer 令牌来调用您经过身份验证的 API

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-26
      • 2019-05-17
      • 2018-07-28
      • 1970-01-01
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多