Добавление авторизации на основе утверждений в MVC 3

У меня есть приложение MVC, в которое я хотел бы добавить авторизацию на основе утверждений. В ближайшем будущем мы будем использовать ADFS2 для федеративного удостоверения, но сейчас мы будем использовать локальную аутентификацию с помощью форм.

Кто-нибудь видел учебник или сообщение в блоге о лучшем способе использования WIF без внешнего поставщика удостоверений?

Я видел следующее, но ему уже год, и я думаю, что должно быть более простое решение:

http://geekswithblogs.net/shahed/archive/2010/02/05/137795.aspx


person chief7    schedule 13.05.2011    source источник


Ответы (2)


Вы можете использовать WIF в MVC без STS.

Я использовал шаблон MVC2 по умолчанию, но он должен работать и с MVC 3.

Тебе надо:

1 – Подключите модуль WIF SessionAuthenticationModule (web.config).

< add name="SessionAuthenticationModule" type="Microsoft.IdentityModel.Web.SessionAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />

2. Где бы вы ни аутентифицировали своих пользователей, создайте ClaimsPrincipal, добавьте все необходимые утверждения, а затем создайте SessionSecurityToken. Это действие LogOn в AccountController, созданное MVC:

 [HttpPost]
        public ActionResult LogOn(LogOnModel model, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                if (MembershipService.ValidateUser(model.UserName, model.Password))
                {
                    var cp = new ClaimsPrincipal();
                    cp.Identities.Add(new ClaimsIdentity());
                    IClaimsIdentity ci = (cp.Identity as IClaimsIdentity);

                    ci.Claims.Add(new Claim(ClaimTypes.Name, model.UserName));

                    SessionSecurityToken sst = FederatedAuthentication
                        .SessionAuthenticationModule
                        .CreateSessionSecurityToken(cp,
                                                    "MVC Test",
                                                    DateTime.
                                                        UtcNow,
                                                    DateTime.
                                                        UtcNow.
                                                        AddHours
                                                        (1),
                                                    true);


                    FederatedAuthentication.SessionAuthenticationModule.CookieHandler.RequireSsl = false;
                    FederatedAuthentication.SessionAuthenticationModule.AuthenticateSessionSecurityToken(sst, true);


                    //FormsService.SignIn(model.UserName, model.RememberMe);
                    if (!String.IsNullOrEmpty(returnUrl))
                    {
                        return Redirect(returnUrl);
                    }
                    else
                    {
                        return RedirectToAction("Index", "Home");
                    }
                }
                else
                {
                    ModelState.AddModelError("", "The user name or password provided is incorrect.");
                }
            }

            // If we got this far, something failed, redisplay form
            return View(model);
        }

Я просто добавил нужные строки, а все остальное оставил прежним. Поэтому может потребоваться некоторый рефакторинг.

С этого момента ваше приложение получит ClaimsPrincipal. Все автоматически обрабатывается WIF.

CookieHandler.RequiresSsl = false только потому, что это машина разработчика, и я не выполняю развертывание в IIS. Это также может быть определено в конфигурации.

person Eugenio Pace    schedule 20.05.2011
comment
Итак, как бы вы добавили еще одного поставщика удостоверений? как гугл или реклама? - person BentOnCoding; 01.09.2012

WIF предназначен для использования STS, поэтому, если вы не хотите этого делать, вам, по сути, придется заново изобретать колесо, как описано в статье.

Когда вы перейдете на ADFS, вам придется практически все перекодировать.

Кроме того, взгляните на StarterSTS. Он реализует тот же тип аутентификации aspnetdb, который вам нужен, но позволяет WIF выполнять подъем тяжестей. Затем, когда вы переходите на ADFS, вам просто нужно запустить FedUtil для ADFS, и все это будет работать без каких-либо серьезных изменений в коде.

(Кстати, есть версия MVC — более поздняя реализация — здесь).

person rbrayb    schedule 15.05.2011