将OpenAM OAuth2与MVC4和OAuthWebSecurity一起使用

时间:2013-12-04 20:26:59

标签: asp.net-mvc asp.net-mvc-4 oauth-2.0 dotnetopenauth openam

在尝试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?

感谢

0 个答案:

没有答案