C# Owin,在身份验证请求中传递自定义查询参数

C# Owin,在身份验证请求中传递自定义查询参数,c#,asp.net-mvc,owin,katana,openid-connect,C#,Asp.net Mvc,Owin,Katana,Openid Connect,我们有自己的OpenID连接提供程序。我们希望使用Owin中间件在身份验证请求中传递自定义查询参数。我们无法找到使用Microsoft.Owin.Security.OpenIdConnect程序集实现此功能的方法。甚至我们也找不到如何向身份验证请求添加标准请求参数(例如“login\u hint parameter”) 例如,Google有“login_hint”和“hd”参数(),我们希望有几乎相同的参数。但我们甚至无法找到如何使用Owin将这些参数发送到谷歌。已尝试此代码: var goog

我们有自己的OpenID连接提供程序。我们希望使用Owin中间件在身份验证请求中传递自定义查询参数。我们无法找到使用Microsoft.Owin.Security.OpenIdConnect程序集实现此功能的方法。甚至我们也找不到如何向身份验证请求添加标准请求参数(例如“login\u hint parameter”)

例如,Google有“login_hint”和“hd”参数(),我们希望有几乎相同的参数。但我们甚至无法找到如何使用Owin将这些参数发送到谷歌。已尝试此代码:

var googleOptions = new GoogleOAuth2AuthenticationOptions()
{
    ClientId = "...",
    ClientSecret = "...",
};
app.UseGoogleAuthentication(googleOptions);

...

public ActionResult ExternalLogin(string provider)
{
    var ctx = Request.GetOwinContext();
    var properties = new AuthenticationProperties();
    properties.Dictionary.Add("login_hint ", "myemail@gmail.com");
    properties.Dictionary.Add("hd", "hd");
    ctx.Authentication.Challenge(properties, provider);
    return new HttpUnauthorizedResult();
}
但是,将生成没有“login_hint”和“hd”参数的身份验证请求url


我们将非常感谢您为解决此问题提供的任何帮助。

您就快到了!剩下的是重写内置的
GoogleOAuth2AuthenticationProvider
,下面是如何执行此操作的示例:

class CustomGoogleAuthProvider : GoogleOAuth2AuthenticationProvider
{
    public CustomGoogleAuthProvider()
    {
        OnApplyRedirect = (GoogleOAuth2ApplyRedirectContext context) =>
        {
            IDictionary<string, string> props = context.OwinContext.Authentication.AuthenticationResponseChallenge.Properties.Dictionary;

            string newRedirectUri = context.RedirectUri;

            string[] paramertsToPassThrough = new[] { "login_hint", "hd", "anything" };

            foreach (var param in paramertsToPassThrough)
            {
                if (props.ContainsKey(param))
                {
                    newRedirectUri += string.Format("&{0}={1}", param, HttpUtility.UrlEncode(props[param]));
                }
            }

            context.Response.Redirect(newRedirectUri);
        };
    }
}
结果(通过使用当前版本(3.0.1)的Google OAuth中间件login_hint,验证参数是现成的):


因此,在与类似问题斗争之后,brockallen向我发送了一些代码,这些代码为我提供了使用identity server 3所需的信息

class CustomGoogleAuthProvider : GoogleOAuth2AuthenticationProvider
{
    public CustomGoogleAuthProvider()
    {
        OnApplyRedirect = (GoogleOAuth2ApplyRedirectContext context) =>
        {
            var signinId = context.OwinContext.Request.Query["signin"];
            var msg = context.OwinContext.Environment.GetSignInMessage(signinId);
            var hint = msg.LoginHint;

            var newRedirectUri = context.RedirectUri;
            newRedirectUri += string.Format("&login_hint={0}", HttpUtility.UrlEncode(hint));

            context.Response.Redirect(newRedirectUri);
        };
    }
}

查看是否有理由在登录密钥的结尾处留有空格\u提示在结尾处留有空格?我似乎无法让它添加到
ctx.Authentication.Challenge
,但空间从未解析出来,它创建了一个带有空格的重定向,我认为它不起作用。是否有一个等效的覆盖将登录提示传递给Azure B2C?@Brendan,没有意识到这一点,建议查看您正在使用的身份验证中间件的实现
class CustomGoogleAuthProvider : GoogleOAuth2AuthenticationProvider
{
    public CustomGoogleAuthProvider()
    {
        OnApplyRedirect = (GoogleOAuth2ApplyRedirectContext context) =>
        {
            var signinId = context.OwinContext.Request.Query["signin"];
            var msg = context.OwinContext.Environment.GetSignInMessage(signinId);
            var hint = msg.LoginHint;

            var newRedirectUri = context.RedirectUri;
            newRedirectUri += string.Format("&login_hint={0}", HttpUtility.UrlEncode(hint));

            context.Response.Redirect(newRedirectUri);
        };
    }
}