Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript客户端(无UI)访问验证API的IdentityServer4授权类型_Javascript_Asp.net Core_Identityserver4 - Fatal编程技术网

Javascript客户端(无UI)访问验证API的IdentityServer4授权类型

Javascript客户端(无UI)访问验证API的IdentityServer4授权类型,javascript,asp.net-core,identityserver4,Javascript,Asp.net Core,Identityserver4,我有一个使用Devexpress Javascript控件的ASP.Net核心web应用程序 我有一个.Net核心API项目是[授权的]。ASP.Net核心web应用程序通过授予类型的ClientCredentials访问API项目,并传入客户端id和客户端密码进行身份验证。这个流程运行良好 我的问题是javascript控件(无UI级身份验证)需要访问API,我不能使用ClientCredentials授权类型,因为客户端机密将在javascript中可见 使用哪种补助金类型?或者如何确保ja

我有一个使用Devexpress Javascript控件的ASP.Net核心web应用程序

我有一个.Net核心API项目是[授权的]。ASP.Net核心web应用程序通过授予类型的ClientCredentials访问API项目,并传入客户端id和客户端密码进行身份验证。这个流程运行良好

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

使用哪种补助金类型?或者如何确保javascript客户端通过身份验证安全地访问API


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

当:
1.
您没有在用户上下文中签名(如服务器到服务器的通信)时,您应该使用
客户端凭据和
2。
您可以使用后台通道以安全的方式保密。这里的后台通道是指应用程序的后端部分

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

前端应用程序
web后端
api

为了避免误解,请看这些视频


我想了解的是,没有UI级身份验证(没有登录屏幕)的Jasavscript客户端如何安全地访问私有API?
-您不能这样做。我想您的代码是在浏览器中执行的,因为您不能使用secret。您需要基于cookie或承载令牌在web后端对js客户端进行身份验证。要获得无秘密的承载令牌,可以使用隐式流。如果你的js应用程序和web应用程序共享同一个域,你可以使用cookie身份验证。

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


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

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

为此,您可以使用[identity server tools][1]。 [1]: https://docs.identityserver.io/en/latest/topics/tools.html 这将生成访问令牌。下面是我的示例代码。这是Asp.net核心应用程序中的帐户控制器

[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;
        }

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

无UI级身份验证
意味着什么?您的javascript应用程序可以在浏览器中工作,对吗?UI级身份验证(用户id和密码)由ASP.Net Coew Web应用程序完成,该应用程序全部为C#,使用的授权类型为混合。javascript客户端与ASP.Net核心web应用程序是分开的。这取决于您是否有单页应用程序。通常对单页应用程序使用隐式授权类型。这里有一个新的建议:auth0.com/blog/oauth2-implicit-grant-and-spa,但我认为你现在还不需要担心这个问题。如果不是spa,那么就像Ganu提到的混合流——我认为这个问题是误导性的。您有一个具有javascript功能的ASP.Net核心web应用程序(mvc?)。如果没有用户界面级的身份验证,怎么会有一个独立的javascript客户端呢?如果javascript没有在iframe中运行,那么它是客户端的一部分,应该能够请求现有的访问令牌。您确定要使用客户端凭据访问api吗?因为您也可以使用用户登录后收到的访问令牌,包括刷新令牌逻辑。您可以分享更多关于如何使用javascript客户端通过后台通道安全发送机密的详细信息吗?隐式流不只需要客户端id吗?因此,如果任何人知道客户端id,他们将能够访问它。不使用隐式流的新建议:
axios.get('/Account/Token?clientId='+'YOUR CLIENT ID HERE').then(resp=>{ 
        token = resp.data;
});