Овин, передайте пользовательские параметры запроса в запросе аутентификации

У нас есть собственный провайдер OpenID Connect. Мы хотим передать настраиваемый параметр запроса в запросе аутентификации с помощью промежуточного программного обеспечения Owin. И мы не можем найти способ, как это реализовать с помощью сборки Microsoft.Owin.Security.OpenIdConnect. Даже мы не можем найти, как добавить стандартный параметр запроса в запрос аутентификации (например, "параметр login_hint").

Например, у Google есть параметры "login_hint" и "hd" (https://developers.google.com/accounts/docs/OAuth2Login#sendauthrequest), и мы хотим иметь почти такие же параметры. Но мы даже не можем найти, как отправить эти параметры в Google с помощью 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 ", "[email protected]");
    properties.Dictionary.Add("hd", "hd");
    ctx.Authentication.Challenge(properties, provider);
    return new HttpUnauthorizedResult();
}

Но URL-адрес запроса аутентификации будет сгенерирован без параметров «login_hint» и «hd».

Буду очень признателен за любую помощь в решении этой проблемы.


person Aliaksei    schedule 25.07.2014    source источник
comment
См. katanaproject.codeplex.com/workitem/325.   -  person Tratcher    schedule 31.07.2014
comment
Есть ли причина, по которой в конце вашего ключа есть пробел, потому что в конце login_hint есть пробел? Кажется, я не могу заставить его добавить в ctx.Authentication.Challenge без пробела, но пробел никогда не анализируется, и он создает перенаправление с пробелом в нем, что, я думаю, не работает.   -  person LavaHot    schedule 20.09.2015


Ответы (2)


Ты почти там! Осталось переопределить встроенный 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);
        };
    }
}

Регистрация промежуточного ПО OWIN:

app.UseGoogleAuthentication(new Microsoft.Owin.Security.Google.GoogleOAuth2AuthenticationOptions()
{
    // other config ...
    Provider = new CustomGoogleAuthProvider(),
});

Результат (кстати, с текущей версией (3.0.1) промежуточного программного обеспечения Google OAuth login_hint прямо из коробки вытекает из параметров аутентификации):

результат

person Eugene D. Gubenkov    schedule 01.05.2015
comment
Существует ли эквивалентное переопределение для передачи login_hint в Azure B2C? - person Brendan; 03.12.2018
comment
@Brendan, не зная об этом, предлагает взглянуть на реализацию промежуточного программного обеспечения аутентификации, которое вы используете. - person Eugene D. Gubenkov; 04.12.2018

Итак, столкнувшись с похожей проблемой, brockallen прислал мне некоторый код, который дает мне то, что мне нужно, с помощью сервера идентификации 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);
        };
    }
}
person Craig Broadman    schedule 16.01.2017