【问题标题】:How to use a custom SSO in my other apps?如何在我的其他应用程序中使用自定义 SSO?
【发布时间】:2021-06-24 16:59:57
【问题描述】:

我试图在我的应用程序中使用自定义 SSO 时碰壁了,所以我想我会退后一步,在这里提问。

我按照this article 在.Net 5.0(没有Identity)中实现了一个RESTful 身份验证API。 我可以使用电子邮件和密码致电 http://localhost:4001/api/auth/login 以获取 JWT 响应

{
    "token": "eyJhb<--removed jwt-->",
    "errors": null
}
  • 这是一个好方法吗?我不想使用像 Identity 这样庞大或像 OAuth 这样复杂的东西。
  • 如何将其与正常的身份验证“流程”联系起来?我知道您在登录时必须 Challenge 身份提供者,但我找不到任何适合我情况的示例。 (尝试使用builder.AddJwtBearer("my_scheme", ... 实现自定义方案,但这是我碰壁的地方)

【问题讨论】:

  • 你不应该在网上发布真正的令牌(不确定你的是否是)。
  • 这只是测试数据,没什么风险,但谢谢;)
  • 这几乎可以工作。两个问题。首先,您的所有客户端应用程序都必须将用户名/密码发布到身份验证端点。这是一个糟糕的设计,您的用户不会在每个应用程序中重复他们的凭据。其次,要发布用户名/密码,客户端应用程序必须收集它。这很糟糕,用户必须信任他们不知道的应用程序。 SAML 或 OpenID 等企业 SSO 流程解决了这些问题。无需设计自己的解决方案,只需实现两者之一。 OpenId 更简单,您甚至可以“手动”完成

标签: c# .net authentication jwt


【解决方案1】:

我设法做我想做的事,所以如果有人偶然发现:

事实证明,当它实际上非常简单时,我把它弄得非常复杂...... 重点是让事情变得简单,因此尝试创建身份验证方案是题外话。 这是最终代码:

        using var client = new HttpClient() { BaseAddress = new Uri("http://localhost:4001/api/") };
        try
        {
            var stringContent = new StringContent(JsonSerializer.Serialize(new { email = model.Email, password = model.Password }), Encoding.UTF8, "application/json");
            var result = await client.PostAsync("auth/login", stringContent);

            var jsonResponse = await result.Content.ReadAsStringAsync();
            var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
            var authResult = JsonSerializer.Deserialize<AuthResult>(jsonResponse, options);

            var jwt = authResult.Token.Jwt;
            var isValidJwt = JwtHelper.ValidateCurrentToken(jwt, _myExternalAuthSettings.RsaPub, _myExternalAuthSettings.Issuer);

            if (isValidJwt)
            {
                HttpContext.Response.Cookies.Append("my_auth", jwt, new CookieOptions()
                {
                    Domain = "localhost",
                    Expires = DateTimeOffset.FromUnixTimeSeconds(authResult.Token.UnixTimeExpiresAt)
                });
                // finish authenticating the user
            }
            // something failed
        }

注意:我遵循this article 能够使用公钥(私钥用于创建它)在本地验证令牌。

干杯

【讨论】:

  • 请注意,这不是 SSO。顾名思义,sso 需要单一 登录。在您的方法中,每个客户端应用程序都应该要求提供电子邮件/密码对。
  • 确实这不是 SSO。我这样称呼它是因为我不知道如何称呼它。
  • 没问题。我不是批评你的回答,也不是反对投票,而是为未来的读者留下评论,否则会感到困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-18
  • 2010-10-10
相关资源
最近更新 更多