【问题标题】:DotNetOpenAuth ClaimsResponse return Null with unified library v4.0 ++ Google OpenIdDotNetOpenAuth ClaimsResponse 返回 Null 与统一库 v4.0 ++ Google OpenId
【发布时间】:2013-01-14 19:37:03
【问题描述】:

我对此感到非常困惑,我知道周围有几个类似的重复帖子,阅读了相当多的内容,并且我对使用 SREG 和 AX 信息的 ClaimsResponse(至少我认为我知道)有所了解,启用 AXFetchAsSregTransform 的 web.config 配置,如何使用 ClaimsRequest 通过 DemandLevel.Require 获取 Google 电子邮件。我想要做的是让我的示例在 v4.0 之后与统一的 DotNetOpenAuth.dll 库一起工作(示例来自 strathweb),作为对我的项目而不是 nuget 包的单一引用。示例适用于 DotNetOpenAuth-3.4.7.11121 版本。如果有人能给我一些关于这个问题的信息,我将不胜感激。当我创建请求并使用 DotNetOpenAuth.dll v3.4.7 时一切顺利:

公共 IAuthenticationRequest ValidateAtOpenIdProvider(字符串 openIdIdentifier, Realm realm, Uri returnurl)

{

IAuthenticationRequest openIdRequest = openId.CreateRequest(Identifier.Parse(openIdIdentifier), realm, 返回网址);

        var fields = new ClaimsRequest()
        {
            Email = DemandLevel.Require,
            FullName = DemandLevel.Require,
            Nickname = DemandLevel.Require
        };
        openIdRequest.AddExtension(fields);

        return openIdRequest;
    }

并将用户重定向到服务提供商:

var response = openidemembership.ValidateAtOpenIdProvider(标识符, realm, new Uri("DomainUrl or Localhost/GoogleCallback"));

        if (response != null)
        {
            return response.RedirectingResponse.AsActionResult();
        }

在用户被重定向回来之后,这两个方法被调用:

public OpenIdUser GetUser() {

        OpenIdUser user = null;
        IAuthenticationResponse openIdResponse = openId.GetResponse();

        if (openIdResponse.IsSuccessful())
        {
            user = ResponseIntoUser(openIdResponse);
        }

        return user;
    }

私有 OpenIdUser ParseResponse(IAuthenticationResponse 响应) {

        OpenIdUser user = null;
        var claimResponseUntrusted = response.GetUntrustedExtension<ClaimsResponse>();
        var claimResponse = response.GetExtension<ClaimsResponse>();
                  if (claimResponse != null)
        {
            user = new OpenIdUser(claimResponse, response.ClaimedIdentifier);
        }
        else if (claimResponseUntrusted != null)
        {
            user = new OpenIdUser(claimResponseUntrusted, response.ClaimedIdentifier);
        }

        return user;
    }

在控制器内部:

public ActionResult GoogleCallback() {

        var user = openidemembership.GetUser();
        if (user != null)
        {
            //Create cookie and redirect the user back 
            return new RedirectResult(Request.Params["ReturnUrl"] ?? "/");
        }

        return View();
    }

Web.Config

 <section name="dotNetOpenAuth" type="DotNetOpenAuth.Configuration.DotNetOpenAuthSection" requirePermission="false" allowLocation="true" />

<dotNetOpenAuth>
    <openid>
      <relyingParty>
        <behaviors>
          <add type="DotNetOpenAuth.OpenId.Behaviors.AXFetchAsSregTransform, DotNetOpenAuth" />
        </behaviors>
      </relyingParty>
    </openid>
  </dotNetOpenAuth>

仍然在使用 DotNetOpenAuth.dll v4.0 +++ 之后,在 ParseResponse 方法调用中我无法从 ClaimsResponse 获取任何值。我正在使用命名空间 DotNetOpenAuth.OpenId.Extensions.SimpleRegistration。使用 nuget 一切都很好,但是有没有其他方法可以让它与单个 dll 一起工作,我真的不会将所有这些来自 nuget 的引用添加到我目前正在为我的一位客户工作的现有项目中,谢谢你提前。

【问题讨论】:

    标签: c# asp.net-mvc-4 openid dotnetopenauth


    【解决方案1】:

    更新您的 web.config 文件以使用 DotNetOpenAuth.OpenId.RelyingParty.Behaviors.AXFetchAsSregTransform。 (注意命名空间的变化添加了“RelyingParty”。在 v4.x 中,DotNetOpenAuth 移动了行为的命名空间以支持多程序集构建,它甚至影响了统一程序集版本。

    <dotNetOpenAuth>
        <openid>
          <relyingParty>
            <behaviors>
              <add type="DotNetOpenAuth.OpenId.RelyingParty.Behaviors.AXFetchAsSregTransform, DotNetOpenAuth" />
            </behaviors>
          </relyingParty>
        </openid>
      </dotNetOpenAuth>
    

    此外,即使您想要统一的程序集,您仍然可以使用 NuGet 获取 DotNetOpenAuth:

    安装包 DotNetOpenAuth.Ultimate

    【讨论】:

    • 安德鲁 - 非常感谢您的快速回答。 NuGet 包 DotNetOpenAuth.Ultimate 确实有效,无论如何我已经尝试按照建议在 web.config 文件中包含命名空间,但问题仍然存在。我宁愿避免使用 nuget,除非没有更清洁的解决方案。非常感谢,最好的问候。
    • 如果要进一步调试,请重新运行场景with logs 并将日志附加到您的问题中。
    • 抱歉没有尽快回复。看来我没有正确设置我的网络配置文件。通过上述设置并按照建议更改命名空间,代码确实适用于 v4+,但仅适用于 FetchResponse 而不适用于 ClaimsResponse。在我将 web.config 文件更改为包含 openid、oauth、消息传递和报告部分的 sectionGroup(如 NuGet 包 DotNetOpenAuth.Ultimate 中)后,ClaimsResponse 开始工作。谢谢你的时间和关心安德鲁,你帮了我很多。继续努力!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多