2009-07-27 8 views
5

MVC Storefront에서 다음 코드를 사용하여 MVC에서 OpenId를 테스트하고 있습니다. 역할을 사용하고 내 테이블의 사용자 이름을 저장할 수 있도록 ASP.Net 멤버쉽과 어떻게 통합합니까? 나는 SO가 비슷한 것을 사용하고 있다고 생각한다.OpenId와 ASP.Net을 통합하는 방법

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

오픈 아이디 공급자는 사용자에 대한 데이터를 반환합니다. 특정 토큰 정보를 요청하거나 요구하지 않으면 사용자의 표시 이름과 ID URL 만 제공됩니다.

사용하고있는 오픈 아이디 라이브러리에 따라 FirstName LastName, DOB (실제로 돌보는 사람)와 같은 토큰을 요청할 수 있으며 사용자가 선택한 ID에 해당 정보를 제공 한 경우 반환하게됩니다. 당신.

그러면 회원 시스템에서 새 사용자를 만들 수 있습니다. Membership API의 요구 사항을 해결하려면 더미 비밀번호를 제공해야합니다.

로그인을 확인하려면 사용자 이름 & 암호와 신원 URL을 사용하는 양식 1 개를 입력하십시오. 공개 ID를 통해 사용자의 유효성을 확인한 후에는 회원 API에서 사용자 이름 (ID url)을 사용하여 사용자를 찾으십시오. 존재하지 않는 경우 생성하십시오.