在外部提供程序身份验证成功后,向 .net Web API 响应添加额外的参数
本文关键字:响应 API Web 添加 参数 net 外部 程序 身份验证 成功 | 更新日期: 2023-09-27 18:34:28
我正在设计一个.NET 4.6 SPA(单页应用程序(。我想在用户通过身份验证后返回其他参数。
在应用程序OAuthProvider中,我有以下代码来返回其他参数:
public override Task TokenEndpoint(OAuthTokenEndpointContext context)
{
foreach (KeyValuePair<string, string> property in context.Properties.Dictionary)
{
context.AdditionalResponseParameters.Add(property.Key, property.Value);
}
return Task.FromResult<object>(null);
}
public static AuthenticationProperties CreateProperties(Participant user, IEnumerable<string> roles)
{
IDictionary<string, string> data = new Dictionary<string, string>
{
{ "userName", user.UserName },
{ "fullName", user.FullName },
{ "userRoles", string.Join(",",roles) }
};
return new AuthenticationProperties(data);
}
这在将 JSON 返回到/Token 的帖子时效果很好,但是,我在使用外部登录操作时遇到问题 - 它使用创建 .NET 4.6 SPA 时自动生成的默认帐户控制器模板,但使用上面定义的修改后的 ApplicationOAuthProvider.CreateProperties 函数。
bool hasRegistered = user != null;
if (hasRegistered)
{
Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie);
ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(UserManager,
OAuthDefaults.AuthenticationType);
ClaimsIdentity cookieIdentity = await user.GenerateUserIdentityAsync(UserManager,
CookieAuthenticationDefaults.AuthenticationType);
AuthenticationProperties properties = ApplicationOAuthProvider.CreateProperties(user, await UserManager.GetRolesAsync(user.Id));
Authentication.SignIn(properties, oAuthIdentity, cookieIdentity);
}
...
return Ok();
我以为这会在 redirect_uri# 之后向片段添加其他参数,但我只得到 3 个参数(access_token、expires_in 和 token_type(。
外部身份验证成功后,如何向片段添加额外参数(或以其他方式在浏览器窗口中获取额外数据(?谢谢。
在这篇 SO 帖子中找到了答案
最终代码如下所示:
public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider
{
...
public override Task AuthorizationEndpointResponse(OAuthAuthorizationEndpointResponseContext context)
{
var props = context.OwinContext.Authentication.AuthenticationResponseGrant.Properties.Dictionary;
foreach (var k in props.Keys)
{
if (k[0] != '.' && !string.Equals(k,"client_id",StringComparison.OrdinalIgnoreCase))
{
context.AdditionalResponseParameters.Add(k, props[k]);
}
}
return base.AuthorizationEndpointResponse(context);
}
整个项目都在GitHub上