我试图让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 - 虽然干净的重新安装并没有改变任何东西。答案 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;
}
}