Авторизация через oAuth в ASP.NET MVC

30 Авг
2011

image
Прочитал недавно пост об oAuth аутентификации в asp.net mvc проекте и хочу поделиться своим решением:

1. Для начала добавляем в проект reference на AR.Web.Authentification
2. Добавляем в web.config (здесь примеры с facebook и mail.ru)
<configSections>
     ...
     <section name="authentification.web" type="AR.Web.Authentification.Configuration.AuthentificationSection, AR.Web.Authentification"/>
     ...
</configSections>
...
<authentification.web callbackUrl="http://www.domain.com/auth/external/{0}/">
     <oauth>
          <provider name="facebook" clientId="000000000000000" clientSecret="00000000000000000000000000000000">
               <authorize url="https://www.facebook.com/dialog/oauth">
                    <params>
                         <param name="client_id" value="{client_id}" />
                         <param name="response_type" value="code" />
                         <param name="scope" value="user_about_me,user_birthday" />
                         <param name="display" value="popup" />
                         <param name="redirect_uri" value="http://www.domain.com/auth/external/{provider}/" />
                    </params>
               </authorize>
               <accessToken url="https://graph.facebook.com/oauth/access_token">
                    <params>
                         <param name="client_id" value="{client_id}" />
                         <param name="client_secret" value="{client_secret}" />
                         <param name="code" value="{code}"/>
                         <param name="redirect_uri" value="http://www.domain.com/auth/external/{provider}/" />
                    </params>
               </accessToken>
               <data url="https://graph.facebook.com/me/">
                    <params>
                         <param name="access_token" value="{access_token}"/>
                    </params>
               </data>
          </provider>
          <provider name="mail.ru" clientId="000000" clientSecret="00000000000000000000000000000000">
               <authorize url="https://connect.mail.ru/oauth/authorize">
                    <params>
                         <param name="client_id" value="{client_id}" />
                         <param name="response_type" value="code" />
                         <param name="scope" value="stream" />
                         <param name="redirect_uri" value="http://www.domain.com/common/external/{provider}/" />
                    </params>
               </authorize>
               <accessToken url="https://connect.mail.ru/oauth/token">
                    <params>
                         <param name="client_id" value="{client_id}" />
                         <param name="client_secret" value="{client_secret}" />
                         <param name="grant_type" value="authorization_code"/>
                         <param name="code" value="{code}"/>
                         <param name="redirect_uri" value="http://www.domain.com/common/external/{provider}/" />
                    </params>
               </accessToken>
               <data url="http://www.appsmail.ru/platform/api/">
                    <params>
                         <param name="app_id" value="{client_id}"/>
                         <param name="method" value="users.getInfo"/>
                         <param name="secure" value="1" />
                         <param name="session_key" value="{access_token}"/>
                         <param name="sig" value="app_id={client_id}method=users.getInfosecure=1session_key={access_token}{client_secret}" type="MD5"/>
                    </params>
               </data>
          </provider>
     </oauth>
</authentification.web>

3. Соответственно добавляем Callback Action в нашем AuthController:
public ActionResult External(string provider)
{
     var success = AuthentificationProvider.Authentificate(provider, (AuthentificationData data) =>
     {
          // Здесь у нас есть объект data, который содержит всю нужную нам информацию о пользователе
          // data.Birthdate
          // data.ClaimedIdentifier
          // data.Email
          // data.Name
          // data.Surname
     });
     return success
          ? (ActionResult)View()
          : new EmptyResult();
}

View.cshtml (подойдет, если открывать аутентификацию в попап окне):
<script type="text/javascript">
     opener.location.reload(true);
     window.close();
</script>

4. Добавляем route для action’а в Global.asax:
     routes.MapRoute("External", "Auth/External/{provider}", new { controller = "Auth", action = "External" });

5. Чтобы начать аутентификацию на странице открываем новое попап окно, например так:
<script type="text/javascript">
     function oAuth(provider)
     {
          var width = 970;
          var height = 600;
          var left = (screen.width / 2) - (width / 2);
          var top = (screen.height / 2) - (height / 2);
          window.open("/Auth/External/"+provider, "Authentification","width=" + width +",height=" + height +",top=" + top +",left=" + left);
     }
</script>
<a href="oAuth('facebook')">Login with Facebook</a>
<a href="oAuth('mail.ru')">Login with Mail.ru</a>
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх