Google OpenId:仅接受特定公司的用户

时间:2012-06-28 11:55:09

标签: asp.net-mvc-3 openid dotnetopenauth google-openid

我正在尝试在我的应用程序中使用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"

EDIT2

刚刚找到google-apps-openid-url

2 个答案:

答案 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。