Asp.net mvc 将OpenAMOAuth2与MVC4和OAuthWebSecurity一起使用

Asp.net mvc 将OpenAMOAuth2与MVC4和OAuthWebSecurity一起使用,asp.net-mvc,asp.net-mvc-4,oauth-2.0,dotnetopenauth,openam,Asp.net Mvc,Asp.net Mvc 4,Oauth 2.0,Dotnetopenauth,Openam,在尝试之前,我尝试过将OpenAM与MVC4结合使用,结果稍微好一点。我需要使用OpenAM从asp.net应用程序进行身份验证,我不喜欢Fedlet路由——我可以看到任何其他尝试过这种方法的人 所以,这是我的出发点。这展示了如何使用谷歌和Facebook,而且效果不错。继续演示如何使用其他提供程序。我将OpenAM与OAuth2一起使用,因此创建了“OpenAMClient”,继承自DotNetOpenAuth.AspNet.Clients.OAuth2Client,并在AuthConfig.

在尝试之前,我尝试过将OpenAM与MVC4结合使用,结果稍微好一点。我需要使用OpenAM从asp.net应用程序进行身份验证,我不喜欢Fedlet路由——我可以看到任何其他尝试过这种方法的人

所以,这是我的出发点。这展示了如何使用谷歌和Facebook,而且效果不错。继续演示如何使用其他提供程序。我将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不可接受。调试代码时,我可以看到返回URL在ExternalLoginResult中以“/Account/ExternalLoginCallback”开头,但当它到达GetServiceLoginUrl时,它已经变成:

http://localhost:60448/Account/ExternalLoginCallback?__provider__=OpenAM&__sid__=12e299cbac474b60a935f946f69d04a8 
OpenAM没有这些功能,因为“sid”参数是动态的,而且它似乎不接受通配符——它不允许OAuthWebSecurity提供的返回URL

作为一种解决方法,我截取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);
}
我添加
http://localhost:60448/Account/OpenAMCallback
作为OpenAM中的重定向URL,然后添加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,因此停止该方

我可以使用和手工操作,但我更愿意使用一个框架,这样维护起来就更少了。我是否遗漏了一些明显的东西,或者OAuthWebSecurity没有真正做到这一点,所以我应该坚持使用dotnetopenauth

谢谢