gpt4 book ai didi

c# - 带有 OpenIdDictServer 的 Rich Twitter Digits/Google Auth

转载 作者:行者123 更新时间:2023-11-30 14:07:25 25 4
gpt4 key购买 nike

我们的应用需要通过手机号码或 Google 登录。我们计划将 Twitter Digits 用于手机号码认证。

我理解的注册和认证流程如下:

  1. 移动应用程序使用 Twitter Digits 或 Google Sign In 进行丰富的身份验证(对用户来说,进行丰富的身份验证比打开网络浏览器选项卡的用户体验更好)。 Twitter 数字/Google 登录返回身份 token 。

  2. 移动应用程序调用 AuthServer 进行登录并提供身份 token 。

  3. 身份服务器使用数字服务或 Google 身份验证服务验证提供的身份 token 。

  4. 验证后,AuthServer 将尝试查找用户,如果不存在,它将创建一个。

  5. AuthServer 将访问 token 返回给移动应用。

现在,我正在寻找实现步骤 #3-4 的选项。

目前,我所做的是修改将用户名作为电话号码或电子邮件地址以及作为 Google/Twitter Digits ID token 发送的密码的 token 端点代码。现在,由于 auth 服务器需要知道发送的密码实际上是一个需要第三方服务验证的 token ,我通过在 TokenHint 中发送服务名称“Digits”或“Google”来解决这个问题。

这非常有效,但我想知道支持我想要实现的目标的最干净的方法是什么。

最佳答案

This works very well, but I am wondering what is the cleanest way to support what I am trying to achieve.

我个人会选择自定义资助类型:

[HttpPost("~/connect/token")]
[Produces("application/json")]
public IActionResult Exchange(OpenIdConnectRequest request)
{
if (request.GrantType == "urn:ietf:params:oauth:grant-type:google_identity_token")
{
// Reject the request if the "assertion" parameter is missing.
if (string.IsNullOrEmpty(request.Assertion))
{
return BadRequest(new OpenIdConnectResponse
{
Error = OpenIdConnectConstants.Errors.InvalidRequest,
ErrorDescription = "The mandatory 'assertion' parameter was missing."
});
}

// Create a new ClaimsIdentity containing the claims that
// will be used to create an id_token and/or an access token.
var identity = new ClaimsIdentity(OpenIdConnectServerDefaults.AuthenticationScheme);

// Manually validate the identity token issued by Google,
// including the issuer, the signature and the audience.
// Then, copy the claims you need to the "identity" instance.

// Create a new authentication ticket holding the user identity.
var ticket = new AuthenticationTicket(
new ClaimsPrincipal(identity),
new AuthenticationProperties(),
OpenIdConnectServerDefaults.AuthenticationScheme);

ticket.SetScopes(
OpenIdConnectConstants.Scopes.OpenId,
OpenIdConnectConstants.Scopes.OfflineAccess);

return SignIn(ticket.Principal, ticket.Properties, ticket.AuthenticationScheme);
}

return BadRequest(new OpenIdConnectResponse
{
Error = OpenIdConnectConstants.Errors.UnsupportedGrantType,
ErrorDescription = "The specified grant type is not supported."
});
}

请注意,您还必须在 OpenIddict 选项中启用它:

// Register the OpenIddict services.
services.AddOpenIddict()
// Register the Entity Framework stores.
.AddEntityFrameworkCoreStores<ApplicationDbContext>()

// Register the ASP.NET Core MVC binder used by OpenIddict.
// Note: if you don't call this method, you won't be able to
// bind OpenIdConnectRequest or OpenIdConnectResponse parameters.
.AddMvcBinders()

// Enable the token endpoint.
.EnableTokenEndpoint("/connect/token")

// Enable the refresh token flow and a custom grant type.
.AllowRefreshTokenFlow()
.AllowCustomFlow("urn:ietf:params:oauth:grant-type:google_identity_token")

// During development, you can disable the HTTPS requirement.
.DisableHttpsRequirement();

发送 token 请求时,确保使用正确的 grant_type 并将您的 id_token 作为 assertion 参数发送,它应该可以工作。

这是一个使用 Facebook 访问 token 的示例:

在实现 token 验证例程时要格外小心,因为这一步特别容易出错。验证所有内容非常重要,包括观众(否则,your server would be vulnerable to confused deputy attacks)。

关于c# - 带有 OpenIdDictServer 的 Rich Twitter Digits/Google Auth,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41223694/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com