Начнем:
1 Откройте Visual Studio 2010 перейдите в меню Файл> New> Project> Web> ASP.NET MVC 3 Применение:
![enter image description here](https://i.stack.imgur.com/GKHQO.png)
затем выберите Internet Application убедитесь, иметь бритву в качестве двигателя Вид и нажмите кнопку Ok:
![enter image description here](https://i.stack.imgur.com/TrGZy.png)
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](https://i.stack.imgur.com/plF0G.png)
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](https://i.stack.imgur.com/trwSo.png)
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](https://i.stack.imgur.com/UphBA.jpg)
Как вы можете видеть, что отображает 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](https://i.stack.imgur.com/0aSca.jpg)
12- Регистрация какой-либо учетной записи, которую вы получите, как эту страницу :
![enter image description here](https://i.stack.imgur.com/6z39r.png)
13- Нажмите кнопку [Выход] и войдите снова, используя тот же OpenID, вы получите как эту страницу:
![enter image description here](https://i.stack.imgur.com/y6e2f.png)
Как вы можете видеть, приветствующая зеленая кнопка обнаруживает, что этот пользователь зарегистрирован.
14- Нажмите на зеленую кнопку, вы получите страницу, как это:
![enter image description here](https://i.stack.imgur.com/U1rg3.png)
Поздравление! , теперь вы включили OpenID в свой проект.
Reference
Для чего это стоит: Я не встретил никаких проблем работает образцов (https://github.com/DotNetOpenAuth/DotNetOpenAuth). Я НЕ раскомментировал раздел доверенных поставщиков, запустил два экземпляра в VS для сервера и клиента и просто ввел http: // localhost: 4864 в поле OpenId. По умолчанию я предполагаю, что образец клиента будет принимать любого поставщика openId. – jbl