1

我正在尝试让 OAuth 与 Visual Studio 2012 Web 表单模板一起使用。我已按照 Scott 视频中的说明进行操作:

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

但它的投入,NullReferenceExceptionOpenAuthProvider.ascx.cs Page_Load()这里:

OpenAuth.RequestAuthentication(provider, redirectUrl);

当您深入研究细节时,它表明它是从 DotNetOpenAuth.AspNet.OpenAuthSecurityManager.RequestAuthentication(String returnUrl)

然而,当我从一个 MVC4 模板开始时,它就像一个梦一样工作。

有没有人遇到过这个?

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

4

4 回答 4

3

我也遇到了这个问题,并写了一篇关于如何解决它的短文。

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

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

于 2012-10-20T00:01:49.377 回答
1

这是针对 Net 4.5 Webforms 稍作修改的OpenAuthProviders.ascx.cs 模板,该模板通过插入代码ProviderNameProviderDisplayName(而不是执行 ToLower)获取来处理问题。如上所述,它处理Microsoft windowslive ProviderDetails从“Microsoft”到“microsoft”的 ToLower() 将不起作用的情况,因为需要“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;
            }
        }
    }
}
于 2013-11-15T02:35:14.397 回答
1

OpenAuthSecurityManager当您通过其OpenAuthSecurityManager(HttpContextBase)构造函数实例化该类时,或者OpenAuthSecurityManager(HttpContextBase, IAuthenticationClient, IOpenAuthDataProvider)如果您null作为第二个参数 传入它的构造函数时,似乎会发生这种情况。

于 2012-09-02T22:10:36.000 回答
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;
    }
}
于 2014-04-03T12:19:44.277 回答