2015-10-09 13 views
5

Ich erstellte die Standard-ASP.NET-Projektvorlage in Visual Studio und ging an die AuthConfig innerhalb App_Start Ordner. Dann unkommentiert ich die folgende Zeile:Authentifizierung mit Google mit OpenOAuthProvider

OpenAuth.AuthenticationClients.AddGoogle(); 

ich den Knopf bekam für die Anmeldung mit Google wie folgt aus:

enter image description here Wenn ich auf Google-Schaltfläche, erhalte ich diese Fehlermeldung:

An exception of type 'DotNetOpenAuth.Messaging.ProtocolException' 
occurred in DotNetOpenAuth.OpenId.RelyingParty.dll but was not handled in user code 

Additional information: No OpenID endpoint found. 

WE.config Datei

<?xml version="1.0" encoding="utf-8"?> 
    <!-- 
     For more information on how to configure your ASP.NET application, please visit 
     http://go.microsoft.com/fwlink/?LinkId=169433 
     --> 
    <configuration> 
     <configSections> 


    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> 
     <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
     </configSections>   
     <system.web> 
     <compilation debug="true" targetFramework="4.5" /> 
     <httpRuntime targetFramework="4.5" /> 
     <pages> 


<namespaces> 
    <add namespace="System.Web.Optimization" /> 
    </namespaces> 
<controls> 
    <add assembly="Microsoft.AspNet.Web.Optimization.WebForms" namespace="Microsoft.AspNet.Web.Optimization.WebForms" tagPrefix="webopt" /> 
</controls></pages> 
<authentication mode="Forms"> 
    <forms loginUrl="~/Account/Login" timeout="2880" defaultUrl="~/" /> 
</authentication> 
<profile defaultProvider="DefaultProfileProvider"> 
    <providers> 


<add name="DefaultProfileProvider" type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" /> 
    </providers> 
</profile> 
<membership defaultProvider="DefaultMembershipProvider"> 
    <providers> 
    <add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" /> 
    </providers> 
</membership> 
<roleManager defaultProvider="DefaultRoleProvider"> 
    <providers> 


     <add name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" /> 
      </providers> 
     </roleManager> 

     <sessionState mode="InProc" customProvider="DefaultSessionProvider"> 
      <providers> 
      <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" /> 
      </providers> 
     </sessionState> 
     </system.web> 
     <runtime> 


    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
      <dependentAssembly> 
      <assemblyIdentity name="DotNetOpenAuth.Core" publicKeyToken="2780ccd10d57b246" /> 
      <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.1.0.0" /> 
      </dependentAssembly> 
      <dependentAssembly> 
      <assemblyIdentity name="DotNetOpenAuth.AspNet" publicKeyToken="2780ccd10d57b246" /> 
      <bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0" /> 
      </dependentAssembly> 
      <dependentAssembly> 
      <assemblyIdentity name="EntityFramework" publicKeyToken="b77a5c561934e089" culture="neutral" /> 
      <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" /> 
      </dependentAssembly> 
      <dependentAssembly> 
      <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" culture="neutral" /> 
      <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" /> 
      </dependentAssembly> 
     </assemblyBinding> 
     </runtime> 
     <entityFramework> 
     <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> 
     </entityFramework> 

    <appSettings> 
      <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" /> 
     </appSettings> 

    </configuration> 

Bitte helfen Sie mir. Was vermisse ich?

+0

tat u die outh Schlüssel in Google-Entwickler erstellt? – Webruster

+0

Können Sie Ihre Datei web.config bereitstellen? Sie können Logging auch in Ihrem Projekt mit log4net einrichten. Dann wirst du definitiv herausfinden, was falsch ist. Ich habe Ihnen einen Link zur Einrichtung der Protokollierung für OpenAuth zur Verfügung gestellt: http://stackoverflow.com/questions/3530753/no-openid-endpoint-found. –

+0

@Webrouster - Nach meinem Wissen mit neuen Vorlage ist es nicht erforderlich, um die Anwendung zu erstellen, bitte korrigieren Sie mich, wenn ich falsch bin – Liquid

Antwort

1

Eigentlich ist diese Art der Implementierung (OpenId) deprecated. Wenn es möglich ist, sollten Sie zu MVC5 wechseln. In MVC5 ist es sehr straightforward. Diese Lösung wird weiterhin funktionieren. Wenn dies nicht möglich ist, müssen Sie entweder yourself schreiben oder eine Drittanbieterkomponente verwenden, die OAuth2 für die Kommunikation mit Google verwendet. Weitere Informationen zu den veralteten Funktionen finden Sie unter this answer.

0

Sie können durch Hinzufügen folgenden Code ConfigureAuth für Google-Authentifizierung fehlt:

app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions() 
     { 
      ClientId = "*****************.googleusercontent.com", 
      ClientSecret = "********************" 

     }); 

Auf Startup.Auth.cs

public void ConfigureAuth(IAppBuilder app) 
    { 
     // Configure the db context, user manager and signin manager to use a single instance per request 
     app.CreatePerOwinContext(ApplicationDbContext.Create); 
     app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 
     app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create); 

     // Enable the application to use a cookie to store information for the signed in user 
     // and to use a cookie to temporarily store information about a user logging in with a third party login provider 
     // Configure the sign in cookie 
     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      LoginPath = new PathString("/Account/Login"), 
      Provider = new CookieAuthenticationProvider 
      { 
       // Enables the application to validate the security stamp when the user logs in. 
       // This is a security feature which is used when you change a password or add an external login to your account. 
       OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
        validateInterval: TimeSpan.FromMinutes(30), 
        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) 
      } 
     });    
     app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 

     // Enables the application to temporarily store user information when they are verifying the second factor in the two-factor authentication process. 
     app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5)); 

     // Enables the application to remember the second login verification factor such as phone or email. 
     // Once you check this option, your second step of verification during the login process will be remembered on the device where you logged in from. 
     // This is similar to the RememberMe option when you log in. 
     app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie); 

     // Uncomment the following lines to enable logging in with third party login providers 
     //app.UseMicrosoftAccountAuthentication(
     // clientId: "", 
     // clientSecret: ""); 

     //app.UseTwitterAuthentication(
     // consumerKey: "", 
     // consumerSecret: ""); 

     //app.UseFacebookAuthentication(
     // appId: "", 
     // appSecret: ""); 

     // The same with Facebook, Twitter, MicrosoftAccount 
     app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions() 
     { 
      ClientId = "*****************.googleusercontent.com", 
      ClientSecret = "********************" 

     }); 
1

Wie Sie erwähnt in Ihrem Chat-Kommentar mit Web Form Application .Auf Click-Ereignis Google.

protected void lnkbtngplus_Click(object sender, EventArgs e) 
{ 
try 
{ 
var Googleurl = "https://accounts.google.com/o/oauth2/auth?response_type=code&redirect_uri=" + ConfigurationManager.AppSettings["googleplus_redirect_url"] + "&scope=googleapis.com/auth/…" + ConfigurationManager.AppSettings["googleplus_client_id"]; 
Session["loginWith"] = "google"; 
Response.Redirect(Googleurl); 
} 

catch (Exception ex) 
{ 
Master.Messages(ex.Message); 
} 
} 

Auf Ihrer Redirect-URL Sie die Parameterwerte sammeln können, wie unten

gezeigt
try 
       { 
        var url = Request.Url.Query; 
        if (url != "") 
        { 
         string queryString = url.ToString(); 
         char[] delimiterChars = { '=' }; 
         string[] words = queryString.Split(delimiterChars); 
         string code = words[1]; 
         SocialNetwork.GoogleUserOutputData json_data = SocialNetwork.Googlemethod(code); 
         String email = String.Empty; 
         String id = String.Empty; 
         email = json_data.email; 
         id = json_data.given_name; 
         if (email != null && email != "") 
         { 
          txtFname.Text = id; 
          txtemail.Text = email; 


         } 


        } 
       } 

       catch (Exception ex) 
       { 

       } 

In Socialnetwork-Klassendatei Ich habe diese folgenden Methoden

#region Google 



    protected static string Parameters; 


    public static GoogleUserOutputData Googlemethod(string code) 
    { 
     GoogleUserOutputData serStatus1 = new GoogleUserOutputData(); 
     string json_data = string.Empty; 
     if (code != null) 
     { 
      //get the access token 
      HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("https://accounts.google.com/o/oauth2/token"); 
      webRequest.Method = "POST"; 
      Parameters = "code=" + code + "&client_id=" + googleplus_client_id + "&client_secret=" + googleplus_client_sceret + "&redirect_uri=" + googleplus_redirect_url + "&grant_type=authorization_code"; 
      byte[] byteArray = Encoding.UTF8.GetBytes(Parameters); 
      webRequest.ContentType = "application/x-www-form-urlencoded"; 
      webRequest.ContentLength = byteArray.Length; 
      Stream postStream = webRequest.GetRequestStream(); 
      // Add the post data to the web request 
      postStream.Write(byteArray, 0, byteArray.Length); 
      postStream.Close(); 

      WebResponse response = webRequest.GetResponse(); 
      postStream = response.GetResponseStream(); 
      StreamReader reader = new StreamReader(postStream); 
      string responseFromServer = reader.ReadToEnd(); 

      GooglePlusAccessToken serStatus = JsonConvert.DeserializeObject<GooglePlusAccessToken>(responseFromServer);//JsonConvert.DeserializeObject<GooglePlusAccessToken>(responseFromServer); 
      //GooglePlusAccessToken serStatus = new GooglePlusAccessToken(); 
      if (serStatus != null) 
      { 
       string accessToken = string.Empty; 
       accessToken = serStatus.access_token; 

       if (!string.IsNullOrEmpty(accessToken)) 
       { 
        using (var w = new WebClient()) 
        { 
         json_data = w.DownloadString("https://www.googleapis.com/oauth2/v1/userinfo?access_token=" + accessToken); 
         serStatus1 = JsonConvert.DeserializeObject<GoogleUserOutputData>(json_data); 
        } 
       } 
       else 
       { } 
      } 
      else 
      { } 
     } 
     return serStatus1; 
    } 

    public class GoogleUserOutputData 
    { 
     public string id { get; set; } 
     public string name { get; set; } 
     public string given_name { get; set; } 
     public string email { get; set; } 
     public string picture { get; set; } 
    } 
    public class GooglePlusAccessToken 
    { 
     public string access_token { get; set; } 
     public string token_type { get; set; } 
     public int expires_in { get; set; } 
     public string id_token { get; set; } 
     public string refresh_token { get; set; } 
    } 

    #endregion 

Hinzufügen der Screenshot der Authentisierung von Google basiert auf meinem Arbeitsbeispiel wie oben

enter image description here