使用OAuth 2在web应用程序和本机桌面应用程序之间进行单点登录

使用OAuth 2在web应用程序和本机桌面应用程序之间进行单点登录,oauth,asp.net-core,oauth-2.0,openid-connect,identityserver4,Oauth,Asp.net Core,Oauth 2.0,Openid Connect,Identityserver4,我们希望编写一个web应用程序(具有ASP.NET核心),通过自定义URL协议启动旧版Windows桌面应用程序。web应用程序必须使用授权服务器通过OAuth 2获取访问(承载)令牌,通过该令牌,它可以通过ASP.NET核心web API访问用户的资源。桌面应用程序也必须能够通过Web API访问用户的资源。桌面应用程序如何获取访问令牌 我可以想到以下几种选择: 桌面应用程序显示一个登录屏幕,将输入的用户名和密码发送到授权服务器(使用OAuth 2的“资源所有者密码凭据”授权类型),并获取一个

我们希望编写一个web应用程序(具有ASP.NET核心),通过自定义URL协议启动旧版Windows桌面应用程序。web应用程序必须使用授权服务器通过OAuth 2获取访问(承载)令牌,通过该令牌,它可以通过ASP.NET核心web API访问用户的资源。桌面应用程序也必须能够通过Web API访问用户的资源。桌面应用程序如何获取访问令牌

我可以想到以下几种选择:

  • 桌面应用程序显示一个登录屏幕,将输入的用户名和密码发送到授权服务器(使用OAuth 2的“资源所有者密码凭据”授权类型),并获取一个访问令牌
  • 桌面应用程序显示嵌入式浏览器窗口。嵌入式浏览器请求授权服务器的OAuth授权端点(使用OAuth 2的“授权代码”授权类型),用户必须登录才能进行授权。授权服务器重定向回重定向URL。桌面应用程序截获此重定向,提取授权令牌并使用它获取访问令牌
  • web应用程序启动桌面应用程序,并将其访问(承载)令牌作为参数传递给桌面应用程序
  • 在启动桌面应用程序之前,web应用程序从授权服务器请求新的授权代码。web应用程序启动桌面应用程序,并将授权代码作为参数传递给桌面应用程序。桌面应用程序通过将授权代码发送到授权服务器的OAuth令牌端点来交换访问令牌的授权代码 我们不希望使用第一个和第二个选项,因为我们希望单点登录

    第三个选项似乎不是一个好主意,因为用户桌面PC上的恶意软件也可以获取并使用访问令牌

    第四种选择似乎是剩下的唯一选择。据我所知,授权码是一种临时(短期)一次性令牌。除此之外,您还需要知道获取访问令牌的客户端密码。 有人能证实第四种选择是正确的吗?还是我忽略了什么


    此场景中是否有IdentityServer的示例?

    两个应用程序都应使用系统浏览器共享登录会话。这样,用户就可以在本机应用程序中获得SSO(甚至反之亦然)

    该规范描述了本机应用程序的最佳实践:

    两个应用程序应使用系统浏览器共享登录会话。这样,用户就可以在本机应用程序中获得SSO(甚至反之亦然)

    该规范描述了本机应用程序的最佳实践:

    为什么您的两个应用不能都是auth server客户端,那么在登录一个用户后就不必登录另一个用户,或者我在这里遗漏了什么。也不要认为传递代币是最好的方法,这有点欺骗了IdSrv的目的。每个客户端都应该进行自身身份验证,并拥有自己的访问权限。您可以定义自定义重定向uri方案,该方案是桌面应用程序的入口点。一旦用户登录,重定向uri方案将打开您的桌面应用程序并传递身份验证代码。使用OAuth,授权代码将通过重定向URL传递给客户端。此重定向URL可以是具有用于启动桌面应用程序的自定义协议的URL。重定向URL可能如下所示:MyCustomProtocol:CustomString?code=Authorization‌​ION_CODE桌面应用程序接收URI作为参数,它可以从中提取授权代码。但是,我认为授权代码是为请求它的客户机准备的,不应该传递给其他客户机。你不同意吗?为什么你的两个应用不能都是auth server的客户端,那么在登录一个用户后就不必登录另一个用户,或者我在这里遗漏了什么。也不要认为传递代币是最好的方法,这有点欺骗了IdSrv的目的。每个客户端都应该进行自身身份验证,并拥有自己的访问权限。您可以定义自定义重定向uri方案,该方案是桌面应用程序的入口点。一旦用户登录,重定向uri方案将打开您的桌面应用程序并传递身份验证代码。使用OAuth,授权代码将通过重定向URL传递给客户端。此重定向URL可以是具有用于启动桌面应用程序的自定义协议的URL。重定向URL可能如下所示:MyCustomProtocol:CustomString?code=Authorization‌​ION_CODE桌面应用程序接收URI作为参数,它可以从中提取授权代码。但是,我认为授权代码是为请求它的客户机准备的,不应该传递给其他客户机。您不同意吗?web应用程序必须将运行它的浏览器的名称(例如“chrome.exe”或“firefox.exe”)传递给本机桌面应用程序(通过自定义URL)。桌面应用程序必须使用授权请求的URL启动此浏览器。桌面应用程序可以在授权请求中指定环回重定向URI,并且必须侦听环回接口以获取身份验证代码。通过使用OAuth代码交换扩展的验证密钥,桌面应用程序可以证明授权和令牌请求均由同一应用程序发出。web应用程序必须将其运行的浏览器名称(例如“chrome.exe”或“firefox.exe”)传递给本机桌面应用程序(通过自定义URL). 桌面应用程序必须使用授权请求的URL启动此浏览器。桌面应用程序可以在授权请求中指定环回重定向URI,并且必须侦听环回接口