Добавление авторизации на основе утверждений в MVC 3 - PullRequest
16 голосов
/ 14 мая 2011

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

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

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

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

Ответы [ 2 ]

21 голосов
/ 20 мая 2011

Вы можете использовать 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.Это также может быть определено в конфигурации.

1 голос
/ 15 мая 2011

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

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

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

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

...