在外部提供程序身份验证成功后,向 .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(。

外部

身份验证成功后,如何向片段添加额外参数(或以其他方式在浏览器窗口中获取额外数据(?谢谢。

在外部提供程序身份验证成功后,向 .net Web API 响应添加额外的参数

在这篇 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上