Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Asp.net 5 MVC 6, добавить разрешение для электронной почты facebook

Автор вопроса: user5049376Ответов: 2

Я хочу знать, как добавить дополнительные разрешения для внешнего входа в Facebook и особенно для электронной почты. Внешний вход в систему работает нормально, но я не могу воспроизвести тот же код, который работал для MVC 5, в этот, так что это то, что у меня есть на данный момент:

        services.Configure<FacebookAuthenticationOptions>(options =>
        {
            options.AppId = Configuration["Authentication:Facebook:AppId"];
            options.AppSecret = Configuration["Authentication:Facebook:AppSecret"];
            options.Scope.Add("email");

        });

но он не добавляет разрешение электронной почты.

Это код, который я использовал в MVC 5 вместе с самородком Facebook SDK:

app.UseFacebookAuthentication(new FacebookAuthenticationOptions
        {
            AppId = "XXXXXX",
            AppSecret = "XXXXXXX",
            Scope = { "email" },
            Provider = new FacebookAuthenticationProvider
            {
                OnAuthenticated = async context =>
                {
                     context.Identity.AddClaim(new System.Security.Claims.Claim("FacebookAccessToken", context.AccessToken));
                }
            }
        });
  • Это может быть связано с этим: github.com/aspnet/Security/issues/435 Mike Wasson 29.09.2015

facebook

Ответы

Ответ 1 · рейтинг 5 · user5049376

Хорошо, благодаря комментарию @Mike Wasson, это привело меня к рабочему ответу,

этот ТАК опубликовать

поэтому то, что я изменил в классе запуска, было следующим:

        services.Configure<FacebookAuthenticationOptions>(options =>
        {
            options.AppId = Configuration["Authentication:Facebook:AppId"];
            options.AppSecret = Configuration["Authentication:Facebook:AppSecret"];
            options.Scope.Add("email");
            options.BackchannelHttpHandler = new FacebookBackChannelHandler();
            options.UserInformationEndpoint = "https://graph.facebook.com/v2.4/me?fields=id,name,email,first_name,last_name,location";
        }

и добавил этот новый класс

public class FacebookBackChannelHandler : HttpClientHandler
{
    protected override async System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
    {
        // Replace the RequestUri so it's not malformed
        if (!request.RequestUri.AbsolutePath.Contains("/oauth"))
        {
            request.RequestUri = new Uri(request.RequestUri.AbsoluteUri.Replace("?access_token", "&access_token"));
        }

        return await base.SendAsync(request, cancellationToken);
    }
}

и никаких дополнительных настроек не требуется, и теперь он может получить электронное письмо :D

Ответ 2 · рейтинг 3 · Jhonattan

Ядро Aspnet RC2

 app.UseFacebookAuthentication(options =>
        {
            options.AppId = Configuration["Authentication:Facebook:AppId"];
            options.AppSecret = Configuration["Authentication:Facebook:AppSecret"];
            options.Fields.Add("name");
            options.Fields.Add("email");
            options.Events = new OAuthEvents
            {
                OnRemoteFailure = context =>
                {
                    context.Response.Redirect($"/Account/ExternalLoginCallback?remoteError={ UrlEncoder.Default.Encode(context.Failure.Message) }");
                    context.HandleResponse();
                    return Task.FromResult(0);
                }
            };
        });

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы