Pytanie Uwierzytelnianie cookie OWIN bez tożsamości ASP.NET


Jestem nowy w ASP.NET MVC 5 i znajduję bardzo niewygodne z uwierzytelniania tożsamości + ramy autoryzacji. Wiem, że jest to nowa cecha środowiska ASP.NET MVC, dlatego chciałbym zastosować alternatywny sposób implementacji uwierzytelniania w aplikacji mYC.

Czy to możliwe? Czytałem, że mogę użyć FormsAuthenticationModule. Czy to dobra alternatywa? Jak mogę go używać w aplikacji opartej na MVC 5?


18
2017-07-20 07:59


pochodzenie


Podstawą systemu uwierzytelniania OWin jest to, że jest całkowicie modułowy. Po prostu biegnij Install-Package Microsoft.Owin.Security.Cookies i zainstaluj go na swoim IAppBuilder. - Aron
Dlaczego nie chcesz używać tożsamości? OWIN to nowy sposób na wstrzykiwanie Twojego uwierzytelnienia. Jeśli ci się nie podoba, zbuduj własny moduł OWIN i wstrzyknij go? Tożsamość to nowy sposób uwierzytelniania użytkowników. Jeśli nie podoba ci się cały element uwierzytelniania społecznego, nie używaj go. FormsAuthentication to sposób, ale stary. - Ralph Jansen
proszę sprawdzić moją odpowiedź tutaj: stackoverflow.com/questions/26485575 to może ci pomóc - Monah


Odpowiedzi:


Czułem to samo, gdy spojrzałem na Tożsamość. Dodaje wiele niepotrzebnych abstrakcji i nie pasuje do mojego przypadku, że mam starszy system, który zaimplementował niestandardowy przepływ pracy uwierzytelniania.

Wiele przykładów na temat uwierzytelniania OWIN za pomocą tożsamości i EF domyślnie sprawia, że ​​deweloperzy są zdezorientowani, że OWIN musi działać w oparciu o Identity and Entity Framework.

Ale technicznie, jesteś w stanie rozebrać Tożsamość, aby używać wyłącznie uwierzytelniania cookie OWIN (Microsoft.Owin.Security.Cookies). Kod okazuje się bardzo prosty, poniżej podaję przykład z mojego kodu, który eliminuje trywialne rzeczy:

[HttpPost]
public ActionResult Login(LoginViewModel model, string returnUrl)
{
    var user = _userService.GetByEmail(model.Email);

    //check username and password from database, naive checking: 
    //password should be in SHA
    if (user != null && (user.Password == model.Password)) 
    {
        var claims = new[] {
                new Claim(ClaimTypes.Name, user.Name),
                new Claim(ClaimTypes.Email, user.Email),
                // can add more claims
            };

        var identity = new ClaimsIdentity(claims, "ApplicationCookie");

        // Add roles into claims
        var roles = _roleService.GetByUserId(user.Id);
        if (roles.Any())
        {
            var roleClaims = roles.Select(r => new Claim(ClaimTypes.Role, r.Name));
            identity.AddClaims(roleClaims);
        }

        var context = Request.GetOwinContext();
        var authManager = context.Authentication;

        authManager.SignIn(new AuthenticationProperties 
               { IsPersistent = model.RememberMe }, identity);

        return RedirectToAction("Index", "Home");
    }
    // login failed.            
}

public ActionResult LogOut()
{
    var ctx = Request.GetOwinContext();
    var authManager = ctx.Authentication;

    authManager.SignOut("ApplicationCookie");
    return RedirectToAction("Login");
}

23
2017-07-20 08:20



dziękuję koleś, to jest po prostu idealne! ale ... muszę obsługiwać role dla użytkowników, czy jest to możliwe za pomocą twojego podejścia? - davioooh
@davioooh: tak, obsługuje takie role, jak uwierzytelnianie formularzy, zaktualizowałem swój kod, aby dodać więcej ról do roszczeń - Cuong Le
Idealny! Na prawdę bardzo ci dziękuję! - davioooh
Ładnie i zwięźle. - Kai Hartmann


Bez użycia metod ochrony Owin: Itz My Controller Coding

[HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Login(Employee emp, string returnUrl)
           {
            using(AdaptiveProjectEntities db = new AdaptiveProjectEntities())
            {
                string email = emp.Email;
               // byte[] en = System.Text.Encoding.UTF8.GetBytes(emp.Password);
                //var ee = Convert.ToBase64String(en);
                string pass = emp.Password;

                bool userValid = db.Employees.Any(user => user.Email == email && user.Password == pass);
                    if(userValid)
                    {
                        FormsAuthentication.SetAuthCookie(email, false);



                         if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                    && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
                {
                    return Redirect(returnUrl);
                }
                else
                {

                    return RedirectToAction("Index", "Projects");
                }
            }
            else
            {
                ModelState.AddModelError("", "The user name or password provided is incorrect.");
            }
                    }



            return View(emp); 

       }
        public ActionResult Logout()
        {
            FormsAuthentication.SignOut();
            return RedirectToAction("Login", "Login");
        }
    }
}

Widok:

<div class="container" style="margin-right:50%">
    <div class="row">
        <div class="col-md-12 col-md-offset-7" style="bottom:-250px">
           <div class="panel panel-default" style="margin-right:15%">
                <div class="panel-heading" style="padding-bottom:5%">

                    <center><h3 style="margin-right:80px">Login</h3></center>
                    @*</div>*@
                    @using (Html.BeginForm())
                    {
                        <div class="modal-body">

                            @Html.AntiForgeryToken()

                            <div class="form-horizontal" style="margin-right: 10%;">
                                @Html.ValidationSummary(true, "", new { @class = "text-danger" })


                                <div class="form-group">
                                    @Html.LabelFor(model => model.Email, htmlAttributes: new { @class = "control-label col-md-3" })
                                    <div class="col-md-9">
                                        @Html.EditorFor(model => model.Email, new { htmlAttributes = new { @class = "form-control", type = "email", required = "required" } })
                                        @Html.ValidationMessageFor(model => model.Email, "", new { @class = "text-danger" })
                                    </div>
                                </div>
                                <div class="form-group">
                                    @Html.LabelFor(model => model.Password, htmlAttributes: new { @class = "control-label col-md-3" })
                                    <div class="col-md-9">
                                        @Html.EditorFor(model => model.Password, new { htmlAttributes = new { @class = "form-control", type = "password", required = "required" } })
                                        @Html.ValidationMessageFor(model => model.Password, "", new { @class = "text-danger" })
                                    </div>
                                </div>

                            </div>
                            <div>
                                <input class="btn btn-primary pull-left col-lg-offset-1" type="submit" value="Login" style="margin-left:35%" />
                            </div>

                        </div>


                    }
                </div>
            </div>
        </div>
        </div>
    </div>
    </div>

1
2017-07-20 08:52