asp.net-mvc-4 - ASP.NET MVC DotNetOpenAuth 授权服务器操作方法

标签 asp.net-mvc-4 oauth-2.0 authorization single-sign-on dotnetopenauth

我有这个场景:一个公司网站(MVC 4)和一个网上商店;添加 OAuth 2 SSO 功能。两个站点都有自己的成员,但 corp 站点(由我负责)也必须作为 OAuth 2 授权服务器,并将为每个成员存储一个网上商店用户 ID。商店请求以下端点:

身份验证端点

• 授权:

    …/oauth2/authorize?client_id={CLIENT_ID}&state={STATE}&response_type=code&redirect_uri={REDIRECT_URI}

• token
    …/oauth2/token?code={TOKEN}&client_id={CLIENT_ID}&client_secret={CLIENT_SECRET}&redirect_uri={REDIRECT_URI}&grant_type=authorization_code

    …/oauth2/token?refresh_token={TOKEN}&client_id={CLIENT_ID}&client_secret={CLIENT_SECRET}&redirect_uri={REDIRECT_URI}&grant_type=refresh_token

API 端点

• getid(将返回带有成员(member)商店 ID 的 JSON):
    …/oauth2/api/getid?access_token={TOKEN}

我没有使用 OAuth 的经验,所以我查看了 DotNetOpenAuth 示例并得出结论,我需要实现 OAuthAuthorizationServer ,但是修改样本以适应我的要求很困难,因为它似乎做得更多而且很复杂。

由于研究 DotNetOpenAuth 似乎非常耗时,我想问一下:修改 OAuthAuthorizationServer 示例是正确的方法吗?或者我应该尝试制作 native 实现或尝试在我的情况下更容易使用的不同 OAuth 库?

请评论我的总体规划:

-保持公司网站成员登录流程标准表单例份验证,直接登录 Controller

- 添加一个 OAuth Controller ,它将三个必需的端点作为操作实现

-当达到授权操作时,我验证客户端并重定向到通过redirect_uri传递的LogOn; 我认为 Authorize ActionResult来自 OAuthController.cs来自 the sample是我应该开始调查的地方,并返回 AccountAuthorizeModel .它是否正确?

- 用户登录后,如果从授权端点到达登录页面,我将重定向到 redirect_uri 并附加代码; 我不知道从哪里开始。 PrepareApproveAuthorizationRequest然后 PrepareResponse ?代码从哪里来?我应该在流程中的哪个位置在数据库中添加新的 ClientAuthorization?

- 然后商店将使用代码从/token 端点获取或刷新 token ; 只需返回 HandleTokenRequest ?

- 使用 token ,商店网站将能够获取成员(member)数据 JSON; 必须找出如何验证 token

现在,除了添加一个 Clients 表来存储客户端 ID 和 secret ,以及 ClientAuthorization 来跟踪谁被授权之外,我不知道是否使用了 DotNetOpenAuth 示例中的其他表以及何时使用:Nonce、SymmetricCryptoKey、User。

修改 OAuth2AuthorizationServer.cs 似乎很简单,我只需要添加真正的证书并确保客户端是从我的数据上下文中提取的。

谢谢!

最佳答案

我认为你在大多数方面都是对的。让我们评论他们:

  • OAuth 服务器应该有 2 个端点(不是 3 个),因为请求 token 和刷新 token 会到达同一个端点(TokenEndpoint)。
  • 这取决于您是要实现不同的身份验证服务器(或 Controller ),还是要在授权服务器内实现身份验证职责。如果它们分开,则身份验证服务器应负责显示登录、身份验证并使用 OpenID 协议(protocol)与授权服务器通信(DotNetOpenAuth 也支持)。
  • 一旦用户通过身份验证,授权服务器应该以某种方式存储用户身份的数据,并使用 DotNetOpenAuth 函数返回授权码(如果使用此 Oauth 流程):

    var response = this.AuthServer.PrepareApproveAuthorizationRequest(AuthorizationRequest, User.Identity.Name); return this.AuthServer.Channel.PrepareResponse(response); finalResponse.AsActionResult();


  • 我认为您不需要在数据库中保存任何有关授权过程的内容,并且代码由 DotNetOpenAuth 生成并发送到客户端到重定向的查询字符串中。
  • 然后,客户端应该获取代码 (ProcessUserAuthorization) 并调用 TokenEndpoint。这个端点只是返回 HandleTokenRequest,它在内部调用了一些 OAuthAuthorizationServer 函数,例如 CreateAccessToken。
  • 一旦客户端拥有访问 token ,它应该调用资源,将 token 发送到 HTTP header “授权”。资源服务器负责验证 token 。

    var resourceServer = new ResourceServer(new StandardAccessTokenAnalyzer(signing, encrypting));

     AccessToken token = resourceServer.GetAccessToken(request, scopes);
    

  • 使用此流程需要 nonce 和 crytoKeys 的存储提供程序。看看类 InMemoryCryptoKeyStore :

    https://github.com/DotNetOpenAuth/DotNetOpenAuth/wiki/Security-scenarios

    希望这可以帮助!

    关于asp.net-mvc-4 - ASP.NET MVC DotNetOpenAuth 授权服务器操作方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19155216/

    相关文章:

    c# - 模型绑定(bind)到列表 MVC 4

    asp.net-mvc - 数据注释本地化

    asp.net-mvc-4 - asp.net - MVC 模型绑定(bind)到嵌套集合

    asp.net - 无法将 IdentityServer4 添加到 ASP.NET Framework 4.7.2 API OWIN

    authentication - API网关应该负责授权吗?

    asp.net-mvc - 如何在 mvc 中保持 View 不受授权逻辑的影响?

    javascript - 如何仅从登录页面禁用 mvc 中的浏览器后退按钮?

    oauth-2.0 - 将 Firebase Google OAuth 身份验证限制为特定用户

    angular - 将 token 存储在浏览器 sessionStorage 中是一个好习惯吗?

    c# - asp.net core authorization - 操作授权处理程序