我正在尝试在我的应用程序中使用open id,并且已成功使用DotNetOpenId。
现在,Google为这些公司域下的电子邮件和其他人提供服务。 (比如 example@acompany.com )。有没有办法缩小对公司用户的身份验证范围?
我知道我可以通过查看回复中的电子邮件地址来实现。但我认为这不是一个好主意。如果用户未通过 acompany.com 以外的Google帐户进行身份验证,则会更好。
请注意,我不知道开放身份验证或 DotNetOpenId 的内部逻辑。
默认情况下,Google的openId请求会提示 https://accounts.google.com/ServiceLogin?...
我可以手动将其(在浏览器中)更改为 https://accounts.google.com/a/iit.du.ac.bd/ServiceLogin?...
并且可以正常工作(iit.du.ac.bd
是我学校的域名)
我尝试使用
创建请求 Identifier id1 = Identifier.Parse("https://www.google.com/a/iit.du.ac.bd");
Identifier id2= Identifier.Parse("https://www.google.com/a/iit.du.ac.bd/accounts/o8/id");
var openid = new OpenIdRelyingParty();
IAuthenticationRequest request1 = openid.CreateRequest(id1);
IAuthenticationRequest request2 = openid.CreateRequest(id2);
Google的标识符为https://www.google.com/accounts/o8/id"
答案 0 :(得分:2)
要验证用户的电子邮件地址,您必须提出要求。要么在身份验证之前要求,要么在DotNetOpenId请求中询问。如果你只是允许@abcInc.com
地址而不是其他任何人,我根本就没有看到使用openId的理由。您最好使用默认的.net成员资格提供程序。
修改:添加后面的openId代码
[AllowAnonymous]
[HttpPost]
public ActionResult openIdLogin(FormCollection collection)
{
var openid = new OpenIdRelyingParty();
IAuthenticationRequest aRequest = openid.CreateRequest(Identifier.Parse(collection["openid_identifier"]));
string ReturnUrl = Request.Form["ReturnUrl"];
if (!String.IsNullOrEmpty(ReturnUrl)) {
aRequest.AddCallbackArguments("ReturnUrl", ReturnUrl);
}
var fetch = new FetchRequest();
fetch.Attributes.AddRequired(WellKnownAttributes.Contact.Email);
aRequest.AddExtension(fetch);
return aRequest.RedirectingResponse.AsActionResult();
}
[AllowAnonymous]
public ActionResult openIdLogin(string ReturnUrl)
{
if (ReturnUrl == null) ReturnUrl = "";
var openid = new OpenIdRelyingParty();
IAuthenticationResponse response = openid.GetResponse();
if (response != null)
{
switch (response.Status)
{
case AuthenticationStatus.Authenticated:
ClaimsResponse sreg = response.GetExtension<ClaimsResponse>();
if (sreg != null)
{
sreg.Email; //do something with the email address
}
//codez
break;
case AuthenticationStatus.Canceled:
ModelState.AddModelError("loginIdentifier", "Login was cancelled at the provider");
break;
case AuthenticationStatus.Failed:
ModelState.AddModelError("loginIdentifier", "Login failed using the provided OpenID identifier");
break;
}
}
return View();
}
答案 1 :(得分:2)
您对使用电子邮件地址作为过滤器犹豫不决绝对正确。跟着你的本能。 :)
您应该过滤OP端点。这不仅可以向您保证Google是提供商,而且Google还为每个域提供了专用的OP端点,因此您可以查看。
IAuthenticationResponse response = relyingParty.GetResponse();
if (response != null) {
if (response.Provider.Uri.AbsoluteUri == "http://google.com/o8/....?domain=yourcompany.com") {
// Allow it
} else {
// Disallow it
}
}
这样的事情。您将需要测试以查看您期望的案例的实际URI。