2

我正在尝试在我的应用程序中使用 open id,并且我已经使用DotNetOpenId成功完成了它。

现在,谷歌为公司域名下的电子邮件和其他服务提供服务。(例如 example@acompany.com)。有没有办法只对公司用户进行身份验证?

我知道我可以通过检查回复中的电子邮件地址来做到这一点。但我不认为这是一个好主意。如果用户未通过acompany.com以外的 Google 帐户进行身份验证,则更好。

请注意,我不知道Open AuthenticationDotNetOpenId的内部逻辑。

编辑

默认谷歌的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"

编辑2

刚刚找到google-apps-openid-url

4

2 回答 2

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();
    }
于 2012-06-28T12:05:22.503 回答
2

您对使用电子邮件地址作为过滤器的犹豫是绝对正确的。跟随你的直觉。:)

您应该过滤 OP Endpoint。这不仅可以向您保证 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 是什么。

于 2012-06-28T18:39:55.950 回答