OpenAuth.RequestAuthentication()在VS2012 Web表单模板中抛出NULL Ref

时间:2012-09-02 10:57:53

标签: oauth visual-studio-2012 dotnetopenauth

我试图让OAuth使用Visual Studio 2012 Web窗体模板。我按照Scott的视频说明进行了操作:

http://www.asp.net/vnext/overview/videos/oauth-in-the-default-aspnet-45-templates

但它在NullReferenceException投掷OpenAuthProvider.ascx.cs Page_Load(),此处:

OpenAuth.RequestAuthentication(provider, redirectUrl);

当您深入研究细节时,它会显示它被DotNetOpenAuth.AspNet.OpenAuthSecurityManager.RequestAuthentication(String returnUrl)

抛出

然而,当我从MVC4模板中新建时,它就像一个梦想。

有没有人遇到过这个?

编辑:在我的笔记本电脑上显然存在环境问题,尝试了替代方案并没有问题。我怀疑这可能是由于我安装VS2012 Ultimate RC,然后安装RTM Professional - 虽然干净的重新安装并没有改变任何东西。

4 个答案:

答案 0 :(得分:3)

我也遇到了这个问题并撰写了一篇关于如何修复它的简短帖子。

简短版本是providerName通过模板传递为“Facebook”或“Google”。 AuthenticationClientManager.GetProviderByName()方法需要"facebook""google"

http://wasntnate.com/2012/10/openauth-requestuthentication-nullreference-exception-explained/

答案 1 :(得分:1)

如果您通过OpenAuthSecurityManager构造函数实例化OpenAuthSecurityManager(HttpContextBase)类,或者如果您将OpenAuthSecurityManager(HttpContextBase, IAuthenticationClient, IOpenAuthDataProvider)作为第二个参数传递给null构造函数,则会发生这种情况。

答案 2 :(得分:1)

以下是针对Net 4.5 Webforms稍加修改的 OpenAuthProviders.ascx.cs模板,它通过插入代码从ProviderName获取ProviderDisplayName来处理此问题(并且不做一个ToLower)。它处理Microsoft windowslive ProviderDetails的情况,其中ToLower()从“Microsoft”到“microsoft”,如上所述,将无法工作,因为需要“windowslive”。这种变化非常强大,并且如上所述处理“谷歌”到“谷歌”的情况。在VS2012 SP3旁安装VS2013后,出现了问题。 VS2013有一个新的身份模型,所以恕我直言这个VS2012代码已被弃用。

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        var provider = Request.Form["provider"];
        if (provider == null)
        {
            return;
        }

        var redirectUrl = "~/Account/RegisterExternalLogin";
        if (!String.IsNullOrEmpty(ReturnUrl))
        {
            var resolvedReturnUrl = ResolveUrl(ReturnUrl);
            redirectUrl += "?ReturnUrl=" + HttpUtility.UrlEncode(resolvedReturnUrl);
        }

        //  **after install VS2013 alongside of VS2012 SP3, needed to add this:**
        IEnumerable<ProviderDetails> details = OpenAuth.AuthenticationClients.GetAll();
        foreach (var d in details)
        {
            if (d.ProviderDisplayName.Equals(provider, StringComparison.OrdinalIgnoreCase))
            {
                provider = d.ProviderName;
                OpenAuth.RequestAuthentication(provider, redirectUrl);
                break;
            }
        }
    }
}

答案 3 :(得分:0)

以下代码解决了我的错误..

IEnumerable<ProviderDetails> details = OpenAuth.AuthenticationClients.GetAll();

foreach (var d in details)
{
    if (d.ProviderDisplayName.Equals(provider, StringComparison.OrdinalIgnoreCase))
    {
        provider = d.ProviderName;
        OpenAuth.RequestAuthentication(provider, redirectUrl);
        break;
    }
}