2009-07-27 4 views
5

Я использую следующий код из MVC Storefront для проверки OpenId в MVC. Как интегрировать его с моим членством в ASP.Net, чтобы я мог использовать роли и сохранять имя пользователя для своих таблиц? Я считаю, что SO также использует что-то подобное.Как интегрировать OpenId с ASP.Net в MVC

public ActionResult OpenIdLogin() 
    { 
     string returnUrl = VirtualPathUtility.ToAbsolute("~/"); 
     var openid = new OpenIdRelyingParty(); 
     var response = openid.GetResponse(); 
     if (response == null) 
     { 
      // Stage 2: user submitting Identifier 
      Identifier id; 
      if (Identifier.TryParse(Request["openid_identifier"], out id)) 
      { 
       try 
       { 
        IAuthenticationRequest req = openid.CreateRequest(Request["openid_identifier"]); 

        var fetch = new FetchRequest(); 
        //ask for more info - the email address 
        var item = new AttributeRequest(WellKnownAttributes.Contact.Email); 
        item.IsRequired = true; 
        fetch.Attributes.Add(item); 
        req.AddExtension(fetch); 

        return req.RedirectingResponse.AsActionResult(); 
       } 
       catch (ProtocolException ex) 
       { 
        ViewData["Message"] = ex.Message; 
        return View("Logon"); 
       } 
      } 
      else 
      { 
       ViewData["Message"] = "Invalid identifier"; 
       return View("Logon"); 
      } 
     } 
     else 
     { 
      // Stage 3: OpenID Provider sending assertion response 
      switch (response.Status) 
      { 
       case AuthenticationStatus.Authenticated: 

        var fetch = response.GetExtension<FetchResponse>(); 
        string name = response.FriendlyIdentifierForDisplay; 
        if (fetch != null) 
        { 
         IList<string> emailAddresses = fetch.Attributes[WellKnownAttributes.Contact.Email].Values; 
         string email = emailAddresses.Count > 0 ? emailAddresses[0] : null; 
         //don't show the email - it's creepy. Just use the name of the email 
         name = email.Substring(0, email.IndexOf('@')); 
        } 
        else 
        { 

         name = name.Substring(0, name.IndexOf('.')); 
        } 

        //FormsAuthentication.SetAuthCookie(name, false); 
        SetCookies(name, name); 
        AuthAndRedirect(name, name); 

        if (!string.IsNullOrEmpty(returnUrl)) 
        { 
         return Redirect(returnUrl); 
        } 
        else 
        { 
         return RedirectToAction("Index", "Home"); 
        } 
       case AuthenticationStatus.Canceled: 
        ViewData["Message"] = "Canceled at provider"; 
        return View("Logon"); 
       case AuthenticationStatus.Failed: 
        ViewData["Message"] = response.Exception.Message; 
        return View("Logon"); 
      } 
     } 
     return new EmptyResult(); 

    } 

    ActionResult AuthAndRedirect(string userName, string friendlyName) 
    { 
     string returnUrl = Request["ReturnUrl"]; 
     SetCookies(userName, friendlyName); 

     if (!String.IsNullOrEmpty(returnUrl)) 
     { 
      return Redirect(returnUrl); 
     } 
     else 
     { 
      return RedirectToAction("Index", "Home"); 
     } 
    } 

ответ

6

На StackOverflow есть несколько вопросов, подобных вашим. This one кажется особенно похожим.

Если вы уже используете провайдер членства для своего сайта и просто добавляете к нему OpenID, то, я думаю, вы застряли в членстве на данный момент и можете использовать один из ответов на вопрос, который я связал, чтобы получить полупристойный членский провайдер, который МОЖЕТ работать для вас.

Но если вы пишете новый сайт и просто хотите «использовать роли и сохранить имя пользователя для пользователя в моих таблицах», как вы сказали, тогда НЕ используйте членство ASP.NET вообще. Это так не стоит! Это не соответствует парадигме без пароля OpenID и просто вызывает больше горя, чем что-либо еще. Если вы не боитесь немного доступа к базе данных самостоятельно, сделайте это именно так. И вы можете легко изменить поведение ролей, просто выставив свой собственный вызов FormsAuthentication.RedirectFromLoginPage или FormsAuthentication.SetAuthCookie и передавая роли, которые пользователь заполняет.

+0

Я играю с новой реализацией, поэтому я не особенно женат на членстве в ASP.NET. Можете ли вы предложить пример кода, как это сделать, как вы упомянули? – Picflight

+0

Я оставлю здесь «меня тоже» для образца кода. Вы знаете что-нибудь? –

+0

Все образцы и шаблоны проектов, которые поставляются с DotNetOpenAuth, делают это так, как я упоминал. –

1

Открытый поставщик идентификационных данных вернет данные о пользователе. Если вы не запрашиваете/не требуете определенных токенов информации, тогда вам будет предоставлено все отображаемое имя пользователя и URL-адрес идентификации.

В зависимости от того, какую открытую библиотеку идентификаторов вы используете, вы можете запросить маркеры, такие как FirstName LastName, DOB (если вас действительно волнует), и если пользователь предоставил информацию об их выбранной личности, то вы получите ее обратно вы.

Затем вы можете использовать это для создания нового пользователя в системе членства. Вероятно, вам придется предоставить им фиктивный пароль, чтобы обойти требования API членства.

Чтобы проверить логин, укажите 1 форму, которая принимает имя пользователя & пароль, а другой - идентификационный URL. После того, как вы проверили пользователя с помощью открытого идентификатора, попробуйте найти пользователя по имени пользователя (идентификационный URL) в API членства. Если он не существует, создайте его.

Смежные вопросы