2009-07-27 7 views
5

Tôi đang sử dụng đoạn mã sau từ MVC Storefront để kiểm tra OpenId trong MVC. Làm cách nào để tích hợp nó với Thành viên ASP.Net của tôi để tôi có thể sử dụng vai trò và lưu tên người dùng cho người dùng trong các bảng của tôi? Tôi tin rằng SO cũng đang sử dụng một cái gì đó tương tự.Làm thế nào để tích hợp OpenId với ASP.Net Membership trong 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"); 
     } 
    } 

Trả lời

6

Có một số câu hỏi như của bạn đã có trên StackOverflow. This one có vẻ đặc biệt tương tự.

Nếu bạn đã sử dụng nhà cung cấp tư cách thành viên cho trang web của mình và chỉ cần thêm OpenID vào trang web đó, thì tôi đoán bạn đang mắc kẹt với tư cách thành viên và có thể sử dụng một trong các câu trả lời cho câu hỏi tôi đã liên kết một nhà cung cấp thành viên bán phong nha CÓ THỂ làm việc cho bạn.

Nhưng nếu bạn đang viết một trang mới và chỉ muốn "sử dụng vai trò và lưu tên người dùng cho người dùng trong bảng của tôi" như bạn đã nói, sau đó KHÔNG sử dụng ASP.NET thành viên ở tất cả. Đó là SO không có giá trị nó! Nó không phù hợp với mô hình ít mật khẩu của OpenID và chỉ gây đau buồn hơn bất cứ thứ gì khác. Nếu bạn không sợ một chút truy cập cơ sở dữ liệu, hãy làm theo cách đó. Và bạn có thể nhận được hành vi Vai trò rất dễ dàng bằng cách chỉ phát hành cuộc gọi FormsAuthentication.RedirectFromLoginPage hoặc FormsAuthentication.SetAuthCookie của riêng bạn và chuyển vào các vai trò mà người dùng điền.

+0

Tôi đang chơi xung quanh với một triển khai mới, vì vậy, tôi không đặc biệt kết hôn với tư cách thành viên ASP.NET. Bạn có thể đề xuất với mã mẫu về cách thực hiện theo cách bạn đã đề cập không? – Picflight

+0

Tôi sẽ để lại "tôi quá" ở đây để lấy mã mẫu. Bạn có biết gì không? –

+0

Tất cả các mẫu và mẫu dự án đi cùng với DotNetOpenAuth đều làm theo cách tôi đã đề cập. –

1

Nhà cung cấp id mở sẽ trả về dữ liệu về người dùng. Nếu bạn không yêu cầu/yêu cầu mã thông báo cụ thể, thì tất cả những gì bạn sẽ được cung cấp là tên hiển thị và URL nhận dạng của người dùng.

Tùy thuộc vào thư viện id đang mở, bạn có thể yêu cầu mã thông báo như FirstName LastName, DOB (nếu bạn thực sự quan tâm) và nếu người dùng cung cấp thông tin đó trên danh tính đã chọn của họ bạn.

Sau đó, bạn có thể sử dụng quyền này để tạo người dùng mới trong hệ thống thành viên. Có thể bạn sẽ phải cung cấp cho họ một mật khẩu giả để nhận được các yêu cầu của API thành viên.

Để xác thực thông tin đăng nhập, hãy cung cấp 1 biểu mẫu nhận mật khẩu tên người dùng & và mật khẩu còn lại nhận URL nhận dạng. Sau khi bạn đã xác thực người dùng qua id mở, hãy thử tìm người dùng theo tên người dùng (url nhận dạng) trong API thành viên. Nếu nó không tồn tại, hãy tạo nó.