我使用DotNetOpenAuth v3.5.0.10357进行OpenID支持。该站点是使用DNOA VS 2010 MVC模板创建的,我稍微修改了它(不使用Ajax支持或用户控件 - 而是使用OpenID jquery插件)。我正在使用特定版本,因为我也实施了Facebook支持。这一切都很好。但是,当我尝试使用谷歌应用程序时,它似乎并没有像我期望的那样工作。这是发生的事情:
1)我使用以下开放ID提供程序将表单提交到:https://www.google.com/accounts/o8/site-xrds?ns=2&hd=example.com
(我通过检查https://www.google.com/accounts/o8/.well-known/host-meta?hd=example.com
返回的文件得到了此内容)
2)我被重定向到谷歌应用程序并要求使用我的谷歌应用程序凭据登录。
3)我被重定向到:http://example.com/Auth/LogOnPostAssertion?dnoa.uipopup=1&dnoa.popupUISupported=1&index=0&dnoa.userSuppliedIdentifier=https://www.google.com/accounts/o8/site-xrds?ns=2&hd=example.com&dnoa.op_endpoint=https://www.google.com/a/example.com/o8/ud?be=o8&dnoa.claimed_id=&openid.ns=http://specs.openid.net/auth/2.0&openid.mode=id_res&openid.op_endpoint=https://www.google.com/a/example.com/o8/ud?be=o8&openid.response_nonce=2011-08-04T05:03:14ZmDjx966VdNKGAQ&openid.return_to=http://example.com/Auth/LogOnPostAssertion?dnoa.uipopup=1&dnoa.popupUISupported=1&index=0&dnoa.userSuppliedIdentifier=https%3A%2F%2Fwww.google.com%2Faccounts%2Fo8%2Fsite-xrds%3Fns%3D2%26hd%3Dexample.com&dnoa.op_endpoint=https%3A%2F%2Fwww.google.com%2Fa%2Fexample.com%2Fo8%2Fud%3Fbe%3Do8&dnoa.claimed_id=&openid.assoc_handle=redacted_value&openid.signed=op_endpoint,claimed_id,identity,return_to,response_nonce,assoc_handle,ns.ext1,ext1.mode,ext1.type.alias3,ext1.value.alias3,ext1.type.alias1,ext1.value.alias1&openid.sig=redacted_value=&openid.identity=http://example.com/openid?id=redacted_value&openid.claimed_id=http://example.com/openid?id=redacted_value&openid.ns.ext1=http://openid.net/srv/ax/1.0&openid.ext1.mode=fetch_response&openid.ext1.type.alias3=http://schema.openid.net/contact/email&openid.ext1.value.alias3=mark.miller@example.com&openid.ext1.type.alias1=http://axschema.org/contact/email&openid.ext1.value.alias1=mark.miller@example.com&openid.ns.ext2=http://specs.openid.net/extensions/ui/1.0&openid.ext2.mode=popup
然后当调用RelyingParty.GetResponse()
时,我被重定向到http://example.com/openid.
我知道如果我正在托管我自己的XRD,我需要提供响应,但似乎所需的一切都在响应中。它不应该只读取请求中的值,在查询字符串中使用声明的标识符并完成它吗?控制器操作在下面--RelyingParty属性的类型为IOpenIDRelyingParty,并从DotNetOpenAuth库中包装OpenIdRelyingParty类型的实例。
我应该以不同的方式处理此案件吗?或者是否完全支持此方案?如果它不受支持,是否有人对我自己添加支持的位置有任何指示?
public ActionResult LogOnPostAssertion(string openid_openidAuthData, string returnUrl){
var response = this.RelyingParty.GetResponse();
if (response == null)
{
//Let us submit the request to OpenID provider
Identifier id;
if (Identifier.TryParse(openid_openidAuthData, out id))
{
try
{
var request = this.RelyingParty.CreateRequest(id, Realm.AutoDetect, Url.ActionFull("LogOnPostAssertion"), this.PrivacyPolicyUrl);
return request.RedirectingResponse.AsActionResult();
}
catch (ProtocolException ex)
{
ViewBag.Message = ex.Message;
}
}
else
{
ViewBag.Message = "Invalid identifier";
}
}
if (response != null && String.IsNullOrEmpty(ViewBag.Message))
{
switch (response.Status)
{
case AuthenticationStatus.Authenticated:
var token = RelyingPartyLogic.User.ProcessUserLogin(response);
this.FormsAuth.SignIn(token.ClaimedIdentifier, false);
if (!String.IsNullOrEmpty(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
case AuthenticationStatus.Canceled:
ModelState.AddModelError("OpenID", "It looks like you canceled login at your OpenID Provider.");
break;
case AuthenticationStatus.Failed:
ModelState.AddModelError("OpenID", response.Exception.Message);
break;
}
}
// If we're to this point, login didn't complete successfully.
// Show the LogOn view again to show the user any errors and
// give another chance to complete login.
return View("LogOn");
}
修改 好吧,所以在使用我的标准gmail帐户(例如@ gmail.com,而不是谷歌应用程序域,@ example.com)调试相同的过程后,我收到谷歌几乎相同的回复一个以上(#3)。除了与参数dnoa.userSuppliedIdentifier相关的标识符和事物之外,一切都非常相似 - 这是预期的。但有一点不同的是参数openid.claimedid参数。这是两者的样子:
openid.claimed_id=http://example.com/openid?id=long_integer_value
openid.claimed_id=https://www.google.com/accounts/o8/id?id=some_hash_value
因此看起来DNOA必须使用claim_id的值对OP(OpenID提供商)进行二次验证。我猜我需要提供一个响应该URL的端点。但是,我的问题就变成了,因为我事先并不知道“id”这个值如何回应DNOA的请求?
答案 0 :(得分:2)
好的,所以我找到了解决方案here
我创建了一个新动作GoogleAppsLogOn
,它与原始问题中的动作相同,并在顶部添加了以下两行代码:
this.RelyingParty.DiscoveryServices.Clear();
this.RelyingParty.DiscoveryServices.Add(new HostMetaDiscoveryService() { UseGoogleHostedHostMeta = true });
在致电RelyingParty.GetResponse()
之前。如果您正在使用VS模板且依赖方是IOpenIdRelyingParty
,则只需将DiscoveryService
添加到接口以及RelyingPartyLogic
项目中提供的包装类,该类也是模板。