在尝试MVC5之前,我开始使用OpenAM和MVC4,结果略好一些。我需要使用OpenAM从asp.net应用程序进行身份验证,并不喜欢Fedlet路由 - 我可以看到其他任何曾尝试过的人
所以,this是我的出发点。这显示了如何使用谷歌和Facebook,它是一种享受。 This继续展示如何使用其他提供商。我正在使用OpenAM和OAuth2,所以创建了“OpenAMClient”,继承自DotNetOpenAuth.AspNet.Clients.OAuth2Client,并在AuthConfig.RegisterAuth中注册了这个:
OAuthWebSecurity.RegisterClient(new OpenAMClient("consumerKey", "consumerSecret"));
这很棒,因为它现在自动出现在登录页面上,并且在我开始使用它进行身份验证之前几乎完美无缺。在GetServiceLoginUrl重写中,我构建了一个到我的OpenAM服务器的路径,附加了由应用程序生成并作为参数传入的returnURL:
protected override Uri GetServiceLoginUrl(Uri returnUrl)
{
var response =
string.Format(
"http://localopenam.hibu.com:9080/openam_10.1.0/oauth2/authorize?client_id={0}&response_type=code&scope=email&redirect_uri={1}",
_consumerKey, returnUrl);
return new Uri(response);
}
这让我进入了我的OpenAM服务器登录页面,但在进行身份验证后,我收到一条错误消息,指出重定向URI不可接受。调试代码,我可以看到ReturnURL在ExternalLoginResult中以“/ Account / ExternalLoginCallback”开始,但是当它到达GetServiceLoginUrl时,它变为:
http://localhost:60448/Account/ExternalLoginCallback?__provider__=OpenAM&__sid__=12e299cbac474b60a935f946f69d04a8
OpenAM没有这个,因为“sid”参数是动态的,并且它似乎没有接受通配符 - 它不允许OAuthWebSecurity提供的returnURL。
作为一种解决方法,我拦截了ReturnURL,并切换到一个新的AccountController方法:
protected override Uri GetServiceLoginUrl(Uri returnUrl)
{
var workingUrl = "http://localhost:60448/Account/OpenAMCallback";
var response =
string.Format(
"http://localopenam.hibu.com:9080/openam_10.1.0/oauth2/authorize?client_id={0}&response_type=code&scope=email&redirect_uri={1}",
_consumerKey, workingUrl);
return new Uri(response);
}
我在OpenAM中添加http://localhost:60448/Account/OpenAMCallback
作为redirectURL,然后添加了AccountController OpenAMCallback:
public ActionResult OpenAMCallback(string code)
{
Console.WriteLine(code );
//use the code to get the token, then user details etc
return RedirectToLocal(null);
}
这很棒,因为从这里我获得了访问代码,因此我可以为令牌提出更多请求,获取所有允许的用户详细信息,所有这些事情,但是......我嫉妒原始的ExternalLoginCallback方法我已经颠覆了,所有其他酷的身份验证服务器都使用。我想使用OAuthWebSecurity.VerifyAuthentication和OAuthWebSecurity.GetOAuthClientData,但VerifyAuthentication将返回null,以便停止该方
我可以使用http://dotnetopenauth.net/并手动完成,但我宁愿使用框架,因此维护的更少。我错过了一些明显的东西,或者OAuthWebSecurity是不是真的达到这个所以我应该坚持使用dotnetopenauth?
感谢