生成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 .
}
我想要的是为这个用户生成访问令牌和刷新令牌。
提前感谢你的帮助。
我假设您在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和长颈鹿