在弹出窗口中使用 Owin 外部登录的 Asp.net 登录提供程序

Posted

技术标签:

【中文标题】在弹出窗口中使用 Owin 外部登录的 Asp.net 登录提供程序【英文标题】:Asp.net Login providers by using Owin external login In a Pop Up Window 【发布时间】:2015-10-14 18:33:23 【问题描述】:

我正在使用带有 Owin 外部登录的 MVC。

Owin 不会将登录作为弹出窗口打开。 它将页面重定向到该登录提供程序。

例如 如果我想通过 facebook 登录,它不会在弹出窗口中打开 facebook 登录,而是重定向到 facebook 登录页面。

到目前为止,我发现我必须为 Facebook 创建一个身份验证提供程序。所以创建一个继承自 FacebookAuthenticationProvider 的类。在这个类中,重写“ApplyRedirect”方法。

这是我的示例代码:

public class FacebookProvider : FacebookAuthenticationProvider

    public override void ApplyRedirect(FacebookApplyRedirectContext context)
    
        context.Response.Redirect(context.RedirectUri + "&display=popup");
    

我将这段代码连接到我的 startup.auth.cs 类中,如下所示:

 app.UseFacebookAuthentication(new FacebookAuthenticationOptions
        
            Provider = new FacebookProvider(), 
            AppId = "xxxxxxxxxx",
            AppSecret = "647e05af9188a8a3ccd0793aae9a846f",
            Scope =  "email" ,
            SignInAsAuthenticationType = Microsoft.Owin.Security.AppBuilderSecurityExtensions.GetDefaultSignInAsAuthenticationType(app)
        );

而我的 _ExternalLoginListPartial.cshtml 是这样的:

@using Microsoft.Owin.Security

<h4>Use another service to log in.</h4>
<hr />
@
    var loginProviders = Context.GetOwinContext().Authentication.GetExternalAuthenticationTypes();
    if (loginProviders.Count() == 0) 
        <div>
            <p>
                There are no external authentication services configured. See <a href="http://go.microsoft.com/fwlink/?LinkId=403804">this article</a>
                for details on setting up this ASP.NET application to support logging in via external services.
            </p>
        </div>
    
    else 
        using (Html.BeginForm("ExternalLogin", "CustomerAccount", new  ReturnUrl = Model.ReturnUrl )) 
            @Html.AntiForgeryToken()
            <div id="socialLoginList">
                <p>
                    @foreach (AuthenticationDescription p in loginProviders) 
                        <button type="submit" class="btn btn-default" id="@p.AuthenticationType" name="provider" value="@p.AuthenticationType" title="Log in using your @p.Caption account">@p.AuthenticationType</button>
                    
                </p>
            </div>
        
    

所以如果有什么办法可以解决我的问题..我花了大约 5 天时间来解决这个问题..

【问题讨论】:

有什么问题?如果你不能使用弹出窗口,那就不要。只需提供redirect_uri 参数,Facebook 将在流程完成后重定向回您的应用程序。见this。 其实我的要求是使用弹窗 我已经使用redirect_uri 实现了,并且成功完成了,.. 我的建议有帮助吗?如果是这样,我会将其添加为您接受的答案。 我已经尝试了你的建议..它很符合我的要求.. 【参考方案1】:

您现在正在做的是告诉 Facebook 显示登录页面,就好像它在弹出窗口中一样。你没有做任何事情来实际上显示一个弹出窗口。

如果您要将button 标签onclick 事件连接到此函数:

<button onclick="return loginPopup('@Model.MyUrl');">My button</button>
function loginPopup(url) 
    var w = window.open(url,'name','height=200,width=150');
    if (window.focus) 
        w.focus();
    
    return false;

然后,我们会更接近一些工作。

【讨论】:

以上是关于在弹出窗口中使用 Owin 外部登录的 Asp.net 登录提供程序的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 iOS 的 phonegap 在弹出窗口中打开 PDF 文件

passport.js ,在弹出窗口中进行身份验证后,将其关闭并重定向父窗口

在 jQuery Mobile 的弹出窗口中打开外部页面

vscode 如何添加 外部web服务器

webBrowser 弹出窗口丢失会话

OWIN openid连接外部登录不执行指定的回调url