2009-08-25 14 views
6

हैलो मेरे पास एएसपीनेट में निम्न कोड है। मैंने OpenID के लिए DotNetOpenAuth.dll का उपयोग किया है।दावे रिस्पॉन्स रिटर्न शून्य

protected void openidValidator_ServerValidate(object source, ServerValidateEventArgs args) 
{ 
    // This catches common typos that result in an invalid OpenID Identifier. 
    args.IsValid = Identifier.IsValid(args.Value); 
} 

protected void loginButton_Click(object sender, EventArgs e) 
{ 
    if (!this.Page.IsValid) 
    { 
     return; // don't login if custom validation failed. 
    } 
    try 
    { 
     using (OpenIdRelyingParty openid = this.createRelyingParty()) 
     { 
      IAuthenticationRequest request = openid.CreateRequest(this.openIdBox.Text); 

      // This is where you would add any OpenID extensions you wanted 
      // to include in the authentication request. 
      ClaimsRequest objClmRequest = new ClaimsRequest(); 
      objClmRequest.Email = DemandLevel.Request; 
      objClmRequest.Country = DemandLevel.Request; 
      request.AddExtension(objClmRequest); 

      // Send your visitor to their Provider for authentication. 
      request.RedirectToProvider(); 
     } 
    } 
    catch (ProtocolException ex) 
    { 
     this.openidValidator.Text = ex.Message; 
     this.openidValidator.IsValid = false; 
    } 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    this.openIdBox.Focus(); 
    if (Request.QueryString["clearAssociations"] == "1") 
    { 
     Application.Remove("DotNetOpenAuth.OpenId.RelyingParty.OpenIdRelyingParty.ApplicationStore"); 

     UriBuilder builder = new UriBuilder(Request.Url); 
     builder.Query = null; 
     Response.Redirect(builder.Uri.AbsoluteUri); 
    } 

    OpenIdRelyingParty openid = this.createRelyingParty(); 
    var response = openid.GetResponse(); 
    if (response != null) 
    { 
     switch (response.Status) 
     { 
      case AuthenticationStatus.Authenticated: 
       // This is where you would look for any OpenID extension responses included 
       // in the authentication assertion. 
       var claimsResponse = response.GetExtension<ClaimsResponse>(); 
       State.ProfileFields = claimsResponse; 
       // Store off the "friendly" username to display -- NOT for username lookup 
       State.FriendlyLoginName = response.FriendlyIdentifierForDisplay; 
       // Use FormsAuthentication to tell ASP.NET that the user is now logged in, 
       // with the OpenID Claimed Identifier as their username. 
       FormsAuthentication.RedirectFromLoginPage(response.ClaimedIdentifier, false); 
       break; 
      case AuthenticationStatus.Canceled: 
       this.loginCanceledLabel.Visible = true; 
       break; 
      case AuthenticationStatus.Failed: 
       this.loginFailedLabel.Visible = true; 
       break; 

      // We don't need to handle SetupRequired because we're not setting 
      // IAuthenticationRequest.Mode to immediate mode. 
      ////case AuthenticationStatus.SetupRequired: 
      //// break; 
     } 
    } 
} 

private OpenIdRelyingParty createRelyingParty() 
{ 
    OpenIdRelyingParty openid = new OpenIdRelyingParty(); 
    int minsha, maxsha, minversion; 
    if (int.TryParse(Request.QueryString["minsha"], out minsha)) 
    { 
     openid.SecuritySettings.MinimumHashBitLength = minsha; 
    } 
    if (int.TryParse(Request.QueryString["maxsha"], out maxsha)) 
    { 
     openid.SecuritySettings.MaximumHashBitLength = maxsha; 
    } 
    if (int.TryParse(Request.QueryString["minversion"], out minversion)) 
    { 
     switch (minversion) 
     { 
      case 1: openid.SecuritySettings.MinimumRequiredOpenIdVersion = ProtocolVersion.V10; break; 
      case 2: openid.SecuritySettings.MinimumRequiredOpenIdVersion = ProtocolVersion.V20; break; 
      default: throw new ArgumentOutOfRangeException("minversion"); 
     } 
    } 
    return openid; 
} 
ऊपर कोड के लिए

के तहत मैं हमेशा

var claimsResponse = response.GetExtension<ClaimsResponse>(); 

हो रही है मैं हमेशा claimsResponse == null हो रही है कोड है। ऐसा क्यों होता है। क्या कोई आवश्यकता है जो RelyingParty के लिए डोमेन सत्यापन जैसे ओपनिड के लिए आवश्यक है ?? कृपया मुझे जितनी जल्दी हो सके उत्तर दें।

उत्तर

3

ऐसा लगता है कि आप सब ठीक कर रहे हैं। इस बिंदु पर यह आपके द्वारा उपयोग किए जा रहे प्रदाता पर निर्भर करता है। आप किसके खिलाफ परीक्षण कर रहे हैं? कुछ सरल पंजीकरण (दावा Request) का समर्थन नहीं करते हैं। अन्य केवल श्वेतसूची वाले आरपी के लिए इसका समर्थन करते हैं। फिर जब आपका आरपी "लोकलहोस्ट" पर होता है तो अन्य इसका समर्थन नहीं करते हैं।

मेरी सलाह: myopenid.com के खिलाफ परीक्षण, जैसा कि सरल पंजीकरण विस्तार के लिए अच्छा, लगातार व्यवहार और समर्थन लगता है। लेकिन आपके आरपी को हमेशा दावे के लिए शून्य प्राप्त करने के लिए तैयार रहना चाहिए, क्योंकि आप कभी गारंटी नहीं देते हैं कि ओपी आपको कुछ भी देगा।

भले ही आपको नॉन-नल नतीजे मिले, व्यक्तिगत फ़ील्ड जिन्हें आपने पूछा था (भले ही आपने उन्हें चिह्नित किया हो) भले ही शून्य या खाली हो।

5

यह भी सुनिश्चित करें कि आपने प्रदाता वेबसाइट पर अपने ओपनआईडी खाते पर जानकारी पंजीकृत की है, और लॉगिन प्रक्रिया के दौरान जानकारी भेजने की अनुमति दी है। मुझे DotNetOpenAuth का उपयोग करने में एक ही समस्या थी, लेकिन यह पता चला कि मैंने अपने myOpenID-खाते पर जानकारी दर्ज नहीं की है। सोचा कि ईमेल पता हमेशा भेजा जाता है, लेकिन ऐसा नहीं है कि ओपनआईडी खाता किसी ईमेल पते से जुड़ा हुआ है।

तो myOpenID पर सुनिश्चित करें कि आप एक पंजीकरण व्यक्तित्व (आपका खाता-> पंजीकरण Personas) है कि मैं जानता हूँ कि आप समस्या हल हो या नहीं किया है न बनाने

+0

आपने मेरा दिन बनाया :) – pkolodziej

0

, लेकिन मैं के कई घंटे के बाद समाधान नहीं मिला संघर्ष। असल में आपको ईमेल और पूर्णनाम का दावा करने के लिए अपनी web.config फ़ाइल को बदलने की आवश्यकता है। Web.config जो मेरे लिए काम करता है। मैंने इसे nerddinner परियोजना से डाउनलोड किया। असल में मैंने web.config को छोड़कर सबकुछ कॉपी किया और मुझे ईमेल फ़ील्ड नहीं मिला। तो बाद में मैंने पाया कि कुछ और गलत है। मैंने nerddinner परियोजना से web.config की प्रतिलिपि बनाई और सब कुछ काम कर रहा था।

यहां फ़ाइल है, यदि आप nerddinner प्रोजेक्ट पर जाना नहीं चाहते हैं।

<?xml version="1.0" encoding="utf-8"?> 
<!-- 
    Note: As an alternative to hand editing this file you can use the 
    web admin tool to configure settings for your application. Use 
    the Website->Asp.Net Configuration option in Visual Studio. 
    A full list of settings and comments can be found in 
    machine.config.comments usually located in 
    \Windows\Microsoft.Net\Framework\v2.x\Config 
--> 
<configuration> 
    <configSections> 
    <sectionGroup name="elmah"> 
    </sectionGroup> 
    <section name="dotNetOpenAuth" type="DotNetOpenAuth.Configuration.DotNetOpenAuthSection" requirePermission="false" allowLocation="true" /> 
    </configSections> 
    <connectionStrings configSource="connectionStrings.config"> 
    </connectionStrings> 
    <dotNetOpenAuth> 
    <openid> 
     <relyingParty> 
     <behaviors> 
      <add type="DotNetOpenAuth.OpenId.Behaviors.AXFetchAsSregTransform, DotNetOpenAuth" /> 
     </behaviors> 
     </relyingParty> 
    </openid> 
    </dotNetOpenAuth> 
    <system.web> 
    <!-- 
      Set compilation debug="true" to insert debugging 
      symbols into the compiled page. Because this 
      affects performance, set this value to true only 
      during development. 
    --> 
    <compilation debug="true" targetFramework="4.0"> 
     <assemblies> 
     <add assembly="System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" /> 
     <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
     <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
     <add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /> 
     <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
     </assemblies> 
    </compilation> 
    <!-- 
      The <authentication> section enables configuration 
      of the security authentication mode used by 
      ASP.NET to identify an incoming user. 
    --> 
    <authentication mode="Forms"> 
     <forms loginUrl="~/Account/Logon" /> 
    </authentication> 
    <membership> 
     <providers> 
     <clear /> 
     <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ApplicationServices" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" applicationName="/" /> 
     </providers> 
    </membership> 
    <profile> 
     <providers> 
     <clear /> 
     <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ApplicationServices" applicationName="/" /> 
     </providers> 
    </profile> 
    <roleManager enabled="false"> 
     <providers> 
     <clear /> 
     <add connectionStringName="ApplicationServices" applicationName="/" name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 
     <add applicationName="/" name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 
     </providers> 
    </roleManager> 
    <customErrors mode="RemoteOnly" defaultRedirect="/Dinners/Trouble"> 
     <error statusCode="404" redirect="/Dinners/Confused" /> 
    </customErrors> 

    <pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"> 
     <namespaces> 
     <add namespace="System.Web.Mvc" /> 
     <add namespace="System.Web.Mvc.Ajax" /> 
     <add namespace="System.Web.Mvc.Html" /> 
     <add namespace="System.Web.Routing" /> 
     <add namespace="System.Globalization" /> 
     <add namespace="System.Linq" /> 
     <add namespace="System.Collections.Generic" /> 
     </namespaces> 
    </pages> 
    <httpHandlers> 
     <add verb="*" path="*.mvc" validate="false" type="System.Web.Mvc.MvcHttpHandler, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" /> 
    </httpHandlers> 
    <httpModules> 
    </httpModules> 
    <trace enabled="true" requestLimit="10" pageOutput="false" traceMode="SortByTime" localOnly="true" /> 
    </system.web> 
    <!-- 
     The system.webServer section is required for running ASP.NET AJAX under Internet 
     Information Services 7.0. It is not necessary for previous version of IIS. 
    --> 
    <system.webServer> 
    <validation validateIntegratedModeConfiguration="false" /> 
    <modules runAllManagedModulesForAllRequests="true"> 
    </modules> 
    <handlers> 
     <remove name="MvcHttpHandler" /> 
     <remove name="UrlRoutingHandler" /> 
     <add name="MvcHttpHandler" preCondition="integratedMode" verb="*" path="*.mvc" type="System.Web.Mvc.MvcHttpHandler, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" /> 
    </handlers> 
    </system.webServer> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" /> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
    <appSettings> 
    <add key="microsoft.visualstudio.teamsystems.backupinfo" value="8;web.config.backup" /> 
    <!-- Fill in your various consumer keys and secrets here to make the sample work. --> 
    <!-- You must get these values by signing up with each individual service provider. --> 
    <!-- Twitter sign-up: https://twitter.com/oauth_clients --> 
    <add key="twitterConsumerKey" value="" /> 
    <add key="twitterConsumerSecret" value="" /> 
    </appSettings> 
    <system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
    </system.serviceModel> 
</configuration> 
संबंधित मुद्दे