Adding Claims-based authorization to MVC 3

后端 未结 2 577
傲寒
傲寒 2020-12-13 05:46

I have an MVC app that I would like to add claims-based authorization to. In the near future we will use ADFS2 for federated identity but for now we will used forms auth lo

2条回答
  •  有刺的猬
    2020-12-13 06:20

    You can use WIF in MVC without an STS.

    I used the default MVC2 template, but it should work with MVC 3 too.

    You need to:

    1- Plug WIF 's SessionAuthenticationModule (web.config)

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

    2- Wherever you authenticate your users, create a ClaimsPrincipal, add all required claims and then create a SessionSecurityToken. This is the LogOn Action in the AccountController created by 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);
            }
    

    I just added the required lines and left everything else the same. So some refactoring might be required.

    From there on, your app will now receive a ClaimsPrincipal. All automatically handled by WIF.

    The CookieHandler.RequiresSsl = false is only because it's a dev machine and I'm not deploying on IIS. It can be defined in configuration too.

提交回复
热议问题