Подтвердить что ты не робот

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

У нас есть собственный поставщик 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".

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

4b9b3361

Ответ 1

Ты почти там! То, что осталось, является встроенным 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 middleware login_hint течет из параметров проверки подлинности из коробки):

result

Ответ 2

Итак, борясь с подобным типом проблемы, 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);
        };
    }
}