2013-08-17 3 views
12

Я пытаюсь настроить образцы DotNetOpenAuth, чтобы иметь рабочее решение SSO с пользовательским поставщиком. Я использую образец проекта OpenIdProviderMvc, который работает нормально.Dotnetopenauth единый вход с заказчиком идентификации

Мои проблемы настраивают «потребитель», в данном случае проект образца OpenIdRelyingPartyMvc, я не могу настроить его для использования OpenIdProvider.

Я попытался установить конечную точку на web.config потребителя, как это:

<trustedProviders rejectAssertionsFromUntrustedProviders="true"> 
    <add endpoint="http://localhost:4864/OpenID/Provider" /> 
</trustedProviders> 

Но все это я получаю «Нет OpenID конечных точек не найдено.» ошибки (на самом деле, я не совсем уверен в том, что положить на поле OpenID ...)

Этот проект практически не документирован. Может ли кто-нибудь указать мне в правильном направлении?

По крайней мере, чтобы провайдер и потребитель работали и разговаривали друг с другом?

+0

Для чего это стоит: Я не встретил никаких проблем работает образцов (https://github.com/DotNetOpenAuth/DotNetOpenAuth). Я НЕ раскомментировал раздел доверенных поставщиков, запустил два экземпляра в VS для сервера и клиента и просто ввел http: // localhost: 4864 в поле OpenId. По умолчанию я предполагаю, что образец клиента будет принимать любого поставщика openId. – jbl

ответ

7

Начнем:

1 Откройте Visual Studio 2010 перейдите в меню Файл> New> Project> Web> ASP.NET MVC 3 Применение:

enter image description here

затем выберите Internet Application убедитесь, иметь бритву в качестве двигателя Вид и нажмите кнопку Ok:

enter image description here

2- Download Assets folder, он содержит DotNetOpenAuth DLL и файлы OpenID-селектор, который мы будем использовать,

Не стесняйтесь, если вы хотите перейти по этим проектам и открыть их более подробно.

Распакуйте его в папку, которую вы хотите

a - Add the DotNetOpenAuth.dll to references in your site. 

    b- Delete all files/folders in Site Content folder. 

    c- Copy Assets Content files/folders to the site Content . 

    d- Copy the Assets Script files to the site Script. 

.

Ваш проект будет выглядеть следующим образом:

enter image description here

3 Перейти к Соображениям> Общий> _Layout.cshtml и заменить этим новым руководителем, мы просто добавили новые стили и скрипты:

<head> 
    <title>@ViewBag.Title</title> 
    <link href="@Url.Content("~/Content/Site.css")" 
    rel="stylesheet" type="text/css" /> 
    <script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" 
    type="text/javascript"></script> 
    <link href="@Url.Content("~/Content/openid-shadow.css")" 
    rel="stylesheet" type="text/css" /> 
    <link href="@Url.Content("~/Content/openid.css")" 
    rel="stylesheet" type="text/css" /> 
    <script src="@Url.Content("~/Scripts/openid-en.js")" 
    type="text/javascript"></script> 
    <script src="@Url.Content("~/Scripts/openid-jquery.js")" 
    type="text/javascript"></script> 
    <script type="text/javascript"> 
     $(document).ready(function() { 
      openid.init('openid_identifier'); 
     }); 
    </script> 
</head> 

4- Перейти в раздел Модели> AccountModels.CS, перейдите общественного класса LogOnModel

и добавить OpenID атрибут, который мы будем использовать его для хранения возвращенного OpenID с OpenID-Selector

ваш класс будет выглядеть следующим образом:

public class LogOnModel 
{ 
    [Display(Name = "OpenID")] 
    public string OpenID { get; set; } 

    [Required] 
    [Display(Name = "User name")] 
    public string UserName { get; set; } 

    [Required] 
    [DataType(DataType.Password)] 
    [Display(Name = "Password")] 
    public string Password { get; set; } 

    [Display(Name = "Remember me?")] 
    public bool RememberMe { get; set; } 
} 

перейти к общественности класс RegisterModel и добавить OpenID атрибут

public class RegisterModel 
{ 

    [Display(Name = "OpenID")] 
    public string OpenID { get; set; } 

    [Required] 
    [Display(Name = "User name")] 
    public string UserName { get; set; } 

    [Required] 
    [DataType(DataType.EmailAddress)] 
    [Display(Name = "Email address")] 
    public string Email { get; set; } 

    [Required] 
    [ValidatePasswordLength] 
    [DataType(DataType.Password)] 
    [Display(Name = "Password")] 
    public string Password { get; set; } 

    [DataType(DataType.Password)] 
    [Display(Name = "Confirm password")] 
    [Compare("Password", ErrorMessage = 
    "The password and confirmation password do not match.")] 
    public string ConfirmPassword { get; set; } 
} 

Затем перейдите в раздел Услуги в AccountModels.cs

и Изменить CreateUser и добавить GetUser, чтобы получить пользователя по OpenID, ваш интерфейс

будет выглядеть следующим образом:

public interface IMembershipService 
{ 
    int MinPasswordLength { get; } 
    bool ValidateUser(string userName, string password); 
    MembershipCreateStatus CreateUser(string userName, string password, 
             string email, string OpenID); 
    bool ChangePassword(string userName, string oldPassword, string newPassword); 
    MembershipUser GetUser(string OpenID); 
} 

Добавьте их с помощью к AccountModels.cs

using System.Security.Cryptography; 
using System.Text; 

Тогда Добавьте эту функцию в AccountModels.cs, эта функция будет использоваться для преобразования OpenID в GUID

Примечание. : не стесняйтесь использовать лучшее хеширование для вашей системы, MD5 имеет некоторые проблемы с конфликтами.

public Guid StringToGUID(string value) 
{ 
    // Create a new instance of the MD5CryptoServiceProvider object. 
    MD5 md5Hasher = MD5.Create(); 
    // Convert the input string to a byte array and compute the hash. 
    byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(value)); 
    return new Guid(data); 
} 

Изменить Также The CreateUser Функция выглядеть следующим образом:

public MembershipCreateStatus CreateUser(string userName, string password, 
             string email , string OpenID) 
{ 
    if (String.IsNullOrEmpty(userName)) throw 
    new ArgumentException("Value cannot be null or empty.", "userName"); 
    if (String.IsNullOrEmpty(password)) throw 
    new ArgumentException("Value cannot be null or empty.", "password"); 
    if (String.IsNullOrEmpty(email)) throw 
    new ArgumentException("Value cannot be null or empty.", "email"); 

    MembershipCreateStatus status; 
    _provider.CreateUser(userName, password, email, null, null, true, 
          StringToGUID(OpenID), out status); 
    return status; 
} 

Здесь мы используем ЧЛЕНСТВО ProviderUserKey для хранения OpenID и трюк здесь мы преобразовать строку OpenID в GUID будет использоваться методами CreateUser и GetUser.

Теперь давайте добавим эту функцию в AccountModels.cs, которые будут получать пользователя по OpenID:

public MembershipUser GetUser(string OpenID) 
{ 
    return _provider.GetUser(StringToGUID(OpenID), true); 
} 

5- перейти к Соображениям> Account> LogOn.cshtml

заменить всю разметку с этим один, мы интегрируем OpenID-селектор в LogOn Вид:

@model OpenIDMVC3.Models.LogOnModel 
@{ 
    ViewBag.Title = "Log On"; 
} 
<h2> 
    Log On</h2> 
<p> 
    Please enter your username and password. @Html.ActionLink("Register", "Register") 
    if you don't have an account. 
</p> 
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"> 
</script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" 
    type="text/javascript"></script> 
<form action= 
"[email protected](Request.QueryString["ReturnUrl"])" 
method="post" id="openid_form"> 
<input type="hidden" name="action" value="verify" /> 
<div> 
    <fieldset> 
     <legend>Login using OpenID</legend> 
     <div class="openid_choice"> 
      <p> 
       Please click your account provider:</p> 
      <div id="openid_btns"> 
      </div> 
     </div> 
     <div id="openid_input_area"> 
      @Html.TextBox("openid_identifier") 
      <input type="submit" value="Log On" /> 
     </div> 
     <noscript> 
      <p> 
       OpenID is service that allows you to log-on to many different websites 
       using a single indentity. Find out <a href="http://openid.net/what/"> 
       more about OpenID</a>and <a href="http://openid.net/get/"> 
       how to get an OpenID enabled account</a>.</p> 
     </noscript> 
     <div> 
      @if (Model != null) 
      { 
       if (String.IsNullOrEmpty(Model.UserName)) 
       { 
       <div class="editor-label"> 
        @Html.LabelFor(model => model.OpenID) 
       </div> 
       <div class="editor-field"> 
        @Html.DisplayFor(model => model.OpenID) 
       </div> 
       <p class="button"> 
        @Html.ActionLink("New User ,Register", "Register", 
             new { OpenID = Model.OpenID }) 
       </p> 
       } 
       else 
       { 
        //user exist 
       <p class="buttonGreen"> 
        <a href="@Url.Action("Index", "Home")">Welcome , @Model.UserName, 
        Continue..." </a> 
       </p> 

       } 
      } 
     </div> 
    </fieldset> 
</div> 
</form> 

@Html.ValidationSummary(true, "Login was unsuccessful. Please correct the errors 
                and try again.") 
@using (Html.BeginForm()) 
{ 
    <div> 
     <fieldset> 
      <legend>Or Login Normally</legend> 
      <div class="editor-label"> 
       @Html.LabelFor(m => m.UserName) 
      </div> 
      <div class="editor-field"> 
       @Html.TextBoxFor(m => m.UserName) 
       @Html.ValidationMessageFor(m => m.UserName) 
      </div> 
      <div class="editor-label"> 
       @Html.LabelFor(m => m.Password) 
      </div> 
      <div class="editor-field"> 
       @Html.PasswordFor(m => m.Password) 
       @Html.ValidationMessageFor(m => m.Password) 
      </div> 
      <div class="editor-label"> 
       @Html.CheckBoxFor(m => m.RememberMe) 
       @Html.LabelFor(m => m.RememberMe) 
      </div> 
      <p> 
       <input type="submit" value="Log On" /> 
      </p> 
     </fieldset> 
    </div> 
} 

6- Теперь запустите проект, затем нажмите кнопку [Log On] ссылку, вы получите как на этой странице:

ws

7- Перейти к контроллерам> AccountController.cs и добавить их с помощью:

using DotNetOpenAuth.Messaging; 
using DotNetOpenAuth.OpenId; 
using DotNetOpenAuth.OpenId.Extensions.SimpleRegistration; 
using DotNetOpenAuth.OpenId.RelyingParty; 
using DotNetOpenAuth.OpenId.Extensions.AttributeExchange; 

Затем добавить этот атрибут AccountController.cs:

private static OpenIdRelyingParty openid = new OpenIdRelyingParty(); 

Затем добавьте эту функцию для AccountController.CS:

[ValidateInput(false)] 
public ActionResult Authenticate(string returnUrl) 
{ 
    var response = openid.GetResponse(); 
    if (response == null) 
    { 
     //Let us submit the request to OpenID provider 
     Identifier id; 
     if (Identifier.TryParse(Request.Form["openid_identifier"], out id)) 
     { 
      try 
      { 
       var request = openid.CreateRequest(
             Request.Form["openid_identifier"]); 
       return request.RedirectingResponse.AsActionResult(); 
      } 
      catch (ProtocolException ex) 
      { 
       ViewBag.Message = ex.Message; 
       return View("LogOn"); 
      } 
     } 

     ViewBag.Message = "Invalid identifier"; 
     return View("LogOn"); 
    } 

    //Let us check the response 
    switch (response.Status) 
    { 

     case AuthenticationStatus.Authenticated: 
      LogOnModel lm = new LogOnModel(); 
      lm.OpenID = response.ClaimedIdentifier; 
      // check if user exist 
      MembershipUser user = MembershipService.GetUser(lm.OpenID); 
      if (user != null) 
      { 
       lm.UserName = user.UserName; 
       FormsService.SignIn(user.UserName, false); 
      } 

      return View("LogOn", lm); 

     case AuthenticationStatus.Canceled: 
      ViewBag.Message = "Canceled at provider"; 
      return View("LogOn"); 
     case AuthenticationStatus.Failed: 
      ViewBag.Message = response.Exception.Message; 
      return View("LogOn"); 
    } 

    return new EmptyResult(); 
} 

8 - Теперь запустите проект, нажмите [Log On] ссылку и выберите поставщика, как Google

может попросить вас подписать или попросить вас, чтобы разрешить доступ к вашей информации

вы получите страницу, как это:

enter image description here

Как вы можете видеть, что отображает OpenID и кнопки, которые указывают, что это новый пользователь еще не зарегистрирован,

перед нажатием кнопки [Новый пользователь, Регистрация] нам нужно изменить представление регистра и контроллер для доступа к информации OpenID.

9- Перейти к контроллерам> AccountController.cs заменить [ActionResult Register()] этим:

public ActionResult Register(string OpenID) 
{ 
    ViewBag.PasswordLength = MembershipService.MinPasswordLength; 
    ViewBag.OpenID = OpenID; 
    return View(); 
} 

И Изменить [ActionResult Register (модель RegisterModel)] использовать OpenID, когда

создание пользователей:

[HttpPost] 
public ActionResult Register(RegisterModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     // Attempt to register the user 
     MembershipCreateStatus createStatus = 
     MembershipService.CreateUser(model.UserName, model.Password, 
             model.Email,model.OpenID); 

     if (createStatus == MembershipCreateStatus.Success) 
     { 
      FormsService.SignIn(model.UserName, false); 
      return RedirectToAction("Index", "Home"); 
     } 
     else 
     { 
      ModelState.AddModelError("", 
      AccountValidation.ErrorCodeToString(createStatus)); 
     } 
    } 

    // If we got this far, something failed, redisplay form 
    ViewBag.PasswordLength = MembershipService.MinPasswordLength; 
    return View(model); 
} 

10- Перейти к Соображениям> Account> Register.cshtml заменить разметку этим:

@model OpenIDMVC3.Models.RegisterModel 
@{ 
    ViewBag.Title = "Register"; 
} 

<h2>Create a New Account</h2> 
<p> 
    Use the form below to create a new account. 
</p> 
<p> 
    Passwords are required to be a minimum of @ViewBag.PasswordLength 
    characters in length. 
</p> 

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" 
    type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" 
    type="text/javascript"></script> 

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true, "Account creation was unsuccessful. 
              Please correct the errors and try again.") 
    <div> 
     <fieldset> 
      <legend>Account Information</legend> 
      @if (ViewData["OpenID"] != null) 
      { 
      <div class="editor-label"> 
       @Html.Label("OpenID") 
      </div> 
      <div class="editor-label"> 
       @Html.Label((string)ViewBag.OpenID) 
      </div> 
      } 
      <div class="editor-label"> 
       @Html.LabelFor(m => m.UserName) 
      </div> 
      <div class="editor-field"> 
       @Html.TextBoxFor(m => m.UserName) 
       @Html.ValidationMessageFor(m => m.UserName) 
      </div> 

      <div class="editor-label"> 
       @Html.LabelFor(m => m.Email) 
      </div> 
      <div class="editor-field"> 
       @Html.TextBoxFor(m => m.Email) 
       @Html.ValidationMessageFor(m => m.Email) 
      </div> 

      <div class="editor-label"> 
       @Html.LabelFor(m => m.Password) 
      </div> 
      <div class="editor-field"> 
       @Html.PasswordFor(m => m.Password) 
       @Html.ValidationMessageFor(m => m.Password) 
      </div> 

      <div class="editor-label"> 
       @Html.LabelFor(m => m.ConfirmPassword) 
      </div> 
      <div class="editor-field"> 
       @Html.PasswordFor(m => m.ConfirmPassword) 
       @Html.ValidationMessageFor(m => m.ConfirmPassword) 
      </div> 

      <p> 
       <input type="submit" value="Register" /> 
      </p> 
     </fieldset> 
    </div> 
} 

11- Перейти к шагу 8 и давайте нажмите [Новый пользователь, регистрация] кнопку, вы получите это:

enter image description here

12- Регистрация какой-либо учетной записи, которую вы получите, как эту страницу :

enter image description here

13- Нажмите кнопку [Выход] и войдите снова, используя тот же OpenID, вы получите как эту страницу:

enter image description here

Как вы можете видеть, приветствующая зеленая кнопка обнаруживает, что этот пользователь зарегистрирован.

14- Нажмите на зеленую кнопку, вы получите страницу, как это:

enter image description here

Поздравление! , теперь вы включили OpenID в свой проект.

Reference

+0

Очень полное руководство ... Ссылка, похоже, не указывает на то, что вы можете подумать. –

+1

Спасибо, но как я могу связать это с пользовательским поставщиком? т.е. мой собственный поставщик аутентификации? – tggm

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