Действительно потерян с OpenID и ASP.NET MVC - PullRequest
1 голос
/ 02 апреля 2010

Я пытаюсь реализовать OpenID с ASP.NET MVC (да, мы не слышали этого прежде, чем я уверен!)

Это, правда, не большая проблема. Моя огромная проблема заключается в том, что я очень озадачен тем, как это сделать вместе с приложением, которое должно хранить большое количество информации о зарегистрированных пользователях (профили, истории и т. Д.)

Мне кажется, что OpenID убирает сайт-ориентированную логику и делает ее открытой. Это все хорошо, если вы просто сделаете билет аутентификации, который будет рассматриваться как «проверенный» пользователь - но со всей серьезностью я полностью потерян. Можно ли реализовать OpenID таким образом, чтобы вход в него позволял пользователям «существовать» в моем собственном приложении, как если бы они прошли обычную регистрацию?

Я читал код приложения NerdDinner 2.0, который реализует openId, надеясь, что это ответит на мой вопрос - но, увы, я не нахожу таких подсказок.

Ответы [ 3 ]

1 голос
/ 02 апреля 2010

Просто возьмите данные из OpenID и автоматически создайте новую регистрацию. Или перенаправить пользователя с пустым профилем на страницу с формами профиля.

0 голосов
/ 16 ноября 2010

Здесь важно понять, что поставщик OpenID никак не контролирует сессию пользователей. Он только дает вам идентификатор пользователя, который связан с этим пользователем. При желании вы также можете запросить некоторые данные о пользователе. Это означает, что вам не нужно управлять какими-либо пользовательскими данными, кроме идентификатора OpenID пользователя. В большинстве случаев вы хотите связать этот идентификатор с пользователем в вашей базе данных, но это не является строго обязательным.

Но вы должны управлять сессией самостоятельно. Когда вы входите в систему с помощью OpenID, вы не можете понять, что вы на самом деле вошли в систему. Все, что он знает, это то, что вы общались с провайдером. Это означает, что действия mvc, к которым применен AuthorizeAttribute, все равно не будут запущены. Для этого вам нужно выдать FormsAuthenticationTicket примерно так:

private void IssueFormsAuthenticationTicket(string identifier, bool rememberMe)
{
    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
        1,                         //version
        identifier,                //name
        DateTime.Now,              //issue date
        DateTime.Now.AddDays(14),  //expiration date
        rememberMe,                //is presistant
        identifier                 //user data
    );

    //Now we encrypt the ticket so no one can read it...
    string encTicket = FormsAuthentication.Encrypt(ticket);

    //...make a cookie and add it. ASP.NET will now know that our user is logged in.
    Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));
}

Это простая версия этого. Затем вы можете получить доступ к данным идентификатора, используя User.Identity.Name.

Если вы хотите, чтобы некоторые пользовательские данные хранились в вашей базе данных, вы можете сделать это с помощью регистрационной формы, которая следует за логином OpenID и связать идентификатор с учетной записью (вы также можете выбрать привязку нескольких идентификаторов OpenID к одной учетной записи) , Как я уже упоминал, вы также можете запросить некоторые данные у провайдера и использовать их для автоматической регистрации. Но будьте осторожны, поскольку все поставщики не всегда предоставляют все, даже если вы говорите, что оно должно быть у вас.

Например, Google предоставляет вам только данные, помеченные как обязательные. Я просто игнорирую все запросы на данные, которые вы хотели бы получить, если вы можете получить их, но на самом деле вы не должны их получать. MyOpenID предоставит вам все данные, помеченные как обязательные или запрошенные, если пользователь введет их в свою персону. Но вход в систему будет даже успешным, если у Persona пользователя нет данных, которые вы пометили как необходимые.

Делать OpenID в ASP.NET MVC, на мой взгляд, лучше всего с DotNetOpenAuth. У них также есть образец для MVC, который является самым простым, но он работает. В этом примере не показано, как запрашивать данные о пользователе, но вы можете найти это в NerdDinner.

0 голосов
/ 02 апреля 2010

Типичный способ сделать это - просто связать OpenID с существующей учетной записью пользователя. В моих случаях у меня есть таблица ассоциаций, поскольку у пользователя может быть несколько OpenID.

Так что, если у меня есть учетная запись и я регистрируюсь с https://openid.org/steven, то это сопоставляется с существующей учетной записью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...