生成OAuth2令牌程序,在我的情况下不需要lgoin

本文关键字:我的 情况下 不需要 lgoin OAuth2 令牌 程序 生成 | 更新日期: 2023-09-27 18:20:04

我将OAuth2与asp.net WEB API一起使用。

在我的情况下,用户将只使用他们的电话号码登录,他们将收到带有验证码的短信。

用户使用以下方法使用验证码确认他们的电话号码:

    [AllowAnonymous]
    [Route("ConfrimPhoneNumber")]
    [HttpPost]
    public async Task<IHttpActionResult> VerifyPhoneNumber(VerfyPhoneModel Model)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
        // Verify phone number.
        //..
        //..
        //Get Application User
        //  I need to genereate and return token from here .
    }

我想要的是为这个用户生成访问令牌和刷新令牌。

提前感谢你的帮助。

生成OAuth2令牌程序,在我的情况下不需要lgoin

我假设您在VisualStudio中使用默认的SPA模板。在Startup.Auth.cs中,您有一个静态属性:

public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; }

如果你想创建一个OAuth2令牌,你可以使用这个静态引用来生成令牌:

Startup.OAuthOptions.AccessTokenFormat.Protect(authenticationTicket);

我想分享我所做的工作,我从其他不同的帖子中收集答案;你可以在这个答案的末尾找到链接。

如果任何人有意见或想法,请与我们分享。

在用户注册为响应后生成具有刷新令牌的本地访问令牌

正如彼得·海德伯格所回答的那样;我们需要在启动类中将OAuthOptions设为Puplic和static,如下所示:

 public static OAuthAuthorizationServerOptions OAuthServerOptions { get; private set; }

然后我创建了助手类来生成本地访问令牌并刷新

    public async Task<JObject> GenerateLocalAccessToken(ApplicationUser user)
            {
                ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(UserManager,
                        OAuthDefaults.AuthenticationType);

                AuthenticationProperties properties = ApplicationOAuthProvider.CreateProperties(user.UserName);
                //Create the ticket then the access token
                var ticket = new AuthenticationTicket(oAuthIdentity, properties);
                ticket.Properties.IssuedUtc = DateTime.UtcNow;
                ticket.Properties.ExpiresUtc = DateTime.UtcNow.Add(Startup.OAuthServerOptions.AccessTokenExpireTimeSpan);
                var accessToken = Startup.OAuthOptions.AccessTokenFormat.Protect(ticket);

                //Create refresh token
                Microsoft.Owin.Security.Infrastructure.AuthenticationTokenCreateContext context =
                    new Microsoft.Owin.Security.Infrastructure.AuthenticationTokenCreateContext(
                        Request.GetOwinContext(),
                        Startup.OAuthOptions.AccessTokenFormat, ticket);
                await Startup.OAuthOptions.RefreshTokenProvider.CreateAsync(context);
                properties.Dictionary.Add("refresh_token", context.Token);

                //create the Token Response
                JObject tokenResponse = new JObject(
                                            new JProperty("access_token", accessToken),
                                            new JProperty("token_type", "bearer"),
                                            new JProperty("expires_in", Startup.OAuthServerOptions.AccessTokenExpireTimeSpan.TotalSeconds.ToString()),
                                            new JProperty("refresh_token", context.Token),
                                            new JProperty("userName", user.UserName),
                                            new JProperty(".issued", ticket.Properties.IssuedUtc.ToString()),
                                            new JProperty(".expires", ticket.Properties.ExpiresUtc.ToString())
            );
                return tokenResponse;
            }

使用基本上下文存在问题。SimpleRefreshTokenProvider CreateAsync方法中的SerializeTicket。来自比特技术的消息

似乎在ReceiveAsync方法的上下文中。反序列化票证不是在外部登录的情况下返回验证票证。当我看上下文时。Ticket属性在该调用之后为null。与本地登录流相比,DeserializeTicket方法设置上下文。AuthenticationTicket的Ticket属性。所以现在的谜团是为什么沙漠化票证在两种流动。数据库中受保护的票证字符串已创建在相同的CreateAsync方法中,不同之处仅在于我调用方法,而不是Owinmiddlware正常调用它…并且SerializeTicket或反序列化Ticket抛出错误…

因此,您需要使用Microsoft.Owin.Security.DataHandler.Serializer.TicketSerializer来对票证进行解析和反序列化。它将是这样的:

Microsoft.Owin.Security.DataHandler.Serializer.TicketSerializer serializer
                = new Microsoft.Owin.Security.DataHandler.Serializer.TicketSerializer();
token.ProtectedTicket = System.Text.Encoding.Default.GetString(serializer.Serialize(context.Ticket));

而不是:

token.ProtectedTicket = context.SerializeTicket();

对于ReceiveAsync方法:

Microsoft.Owin.Security.DataHandler.Serializer.TicketSerializer serializer = new Microsoft.Owin.Security.DataHandler.Serializer.TicketSerializer();
context.SetTicket(serializer.Deserialize(System.Text.Encoding.Default.GetBytes(refreshToken.ProtectedTicket)));

而不是:

context.DeserializeTicket(refreshToken.ProtectedTicket);

请参阅此问题和此答案感谢lincx和长颈鹿

相关文章: