Я добираюсь, "подпись сообщения была неправильным" исключением при попытке пройти проверку подлинности с MyOpenID и Yahoo.
Я использую в значительной степени код кода MVC ASP.NET, который шел с DotNetOpenAuth 3.4.2
public ActionResult Authenticate(string openid)
{
var openIdRelyingParty = new OpenIdRelyingParty();
var authenticationResponse = openIdRelyingParty.GetResponse();
if (authenticationResponse == null)
{
// Stage 2: User submitting identifier
Identifier identifier;
if (Identifier.TryParse(openid, out identifier))
{
var realm = new Realm(Request.Url.Root() + "openid");
var authenticationRequest = openIdRelyingParty.CreateRequest(openid, realm);
authenticationRequest.RedirectToProvider();
}
else
{
return RedirectToAction("login", "home");
}
}
else
{
// Stage 3: OpenID provider sending assertion response
switch (authenticationResponse.Status)
{
case AuthenticationStatus.Authenticated:
{
// TODO
}
case AuthenticationStatus.Failed:
{
throw authenticationResponse.Exception;
}
}
}
return new EmptyResult();
}
Хорошо работая с Google, AOL и другими. Однако Yahoo и MyOpenID попадают в AuthenticationStatus. Неудавшийся случай за следующим исключением:
DotNetOpenAuth.Messaging.Bindings.InvalidSignatureException: Message signature was incorrect.
at DotNetOpenAuth.OpenId.ChannelElements.SigningBindingElement.ProcessIncomingMessage(IProtocolMessage message) in c:\Users\andarno\git\dotnetopenid\src\DotNetOpenAuth\OpenId\ChannelElements\SigningBindingElement.cs:line 139
at DotNetOpenAuth.Messaging.Channel.ProcessIncomingMessage(IProtocolMessage message) in c:\Users\andarno\git\dotnetopenid\src\DotNetOpenAuth\Messaging\Channel.cs:line 992
at DotNetOpenAuth.OpenId.ChannelElements.OpenIdChannel.ProcessIncomingMessage(IProtocolMessage message) in c:\Users\andarno\git\dotnetopenid\src\DotNetOpenAuth\OpenId\ChannelElements\OpenIdChannel.cs:line 172
at DotNetOpenAuth.Messaging.Channel.ReadFromRequest(HttpRequestInfo httpRequest) in c:\Users\andarno\git\dotnetopenid\src\DotNetOpenAuth\Messaging\Channel.cs:line 386
at DotNetOpenAuth.OpenId.RelyingParty.OpenIdRelyingParty.GetResponse(HttpRequestInfo httpRequestInfo) in c:\Users\andarno\git\dotnetopenid\src\DotNetOpenAuth\OpenId\RelyingParty\OpenIdRelyingParty.cs:line 540
Появляется, что у других есть та же проблема: http://trac.dotnetopenauth.net:8000/ticket/172
У кого-либо есть обходное решение?
Оказалось, что это была проблема с использованием DotNetOpenAuth в среде веб-фермы.
Когда вы создаете OpenIdRelyingParty, убедитесь, что вы передаете null в конструкторе.
Это переводит ваш веб-сайт в режим OpenID stateless или "немой". Это немного замедляет вход пользователей (если вы вообще это заметите), но вы избежите необходимости писать IRelyingPartyApplicationStore, чтобы позволить DotNetOpenAuth работать в вашей ферме;
var openIdRelyingParty = new OpenIdRelyingParty(null);
Мы исправили эту проблему, реализовав IRelyingPartyApplicationStore
( IOpenIdApplicationStore
в новых версиях DotNetOpenAuth) и добавив имя класса хранилища в файл .config
<dotNetOpenAuth>
<openid ...>
<relyingParty>
...
<store type="some.name.space.MyRelyingPartyApplicationStore, some.assembly"/>
</relyingParty>
</openid>
...
</dotNetOpenAuth>
. Интерфейс состоит из двух другие интерфейсы с пятью участниками вместе.
/// <summary>
/// A hybrid of the store interfaces that an OpenID Provider must implement, and
/// an OpenID Relying Party may implement to operate in stateful (smart) mode.
/// </summary>
public interface IOpenIdApplicationStore : ICryptoKeyStore, INonceStore
{
}
Мы использовали тупой режим как быстрое исправление, чтобы начать работу, но в конце концов вы, вероятно, захотите что-то вроде этого.