2015-10-09 32 views
5

Utworzono domyślny szablon projektu ASP.NET w Visual Studio i przeszedłem do folderu AuthConfig w folderze App_Start. Potem Odkomentowano następującą linię:Uwierzytelnianie za pomocą Google przy użyciu OpenOAuthProvider

OpenAuth.AuthenticationClients.AddGoogle(); 

mam przycisk do logowania się z Google tak:

enter image description here Po kliknięciu na przycisk Google, dostaję ten błąd:

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. 

plik WE.config

<?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> 

Proszę, pomóż mi. czego mi brakuje?

+0

czy utworzyłeś klucz wygód w programistach Google? – Webruster

+0

Czy możesz podać swój plik web.config? Możesz również skonfigurować logowanie w swoim projekcie za pomocą log4net. Wtedy na pewno dowiesz się, co jest nie tak. Podałem ci link do konfiguracji rejestrowania dla OpenAuth: http://stackoverflow.com/questions/3530753/no-openid-endpoint-found. –

+0

@Webruster - Zgodnie z moją wiedzą z nowym szablonem nie jest wymagane, aby utworzyć aplikację, proszę mnie poprawić, jeśli się mylę – Liquid

Odpowiedz

1

W rzeczywistości tego rodzaju wdrożenie (OpenId) to deprecated. Jeśli jest to możliwe, powinieneś zmienić na MVC5. W MVC5 jest bardzo straightforward. To rozwiązanie nadal będzie działać. Jeśli nie możesz, musisz napisać to yourself lub użyć komponentu innej firmy, który używa OAuth2 do komunikacji z Google. Zobacz this answer, aby uzyskać więcej informacji na temat przestarzałej funkcji.

0

Możesz brakuje ConfigureAuth uwierzytelniania Google, Dodaj następujący kod:

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

     }); 

Na 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

jak wspomniano w komentarzu przy użyciu czatu Web Form Application .Na zdarzenia Click 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); 
} 
} 

Na przekierowanie można zbierać wartości parametrów, jak pokazano poniżej

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) 
       { 

       } 

W SocialNetwork pliku klasy mam te następujące metody

#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 

dodanie ekranu uwierzytelnienia z google na podstawie mojego działającego przykładu, jak podano powyżej

enter image description here

Powiązane problemy