Изглежда не мога да получа много елементарен пример за влизане в бисквитка, който да работи с MVC5 и OWIN

Опитвах се да намокря краката си с ASP.net MVC 5 за 2013 г., но досега не успях да накарам дори най-елементарното удостоверяване да работи правилно.

Четох наоколо през последните няколко дни и най-накрая се натъкнах на (http://brockallen.com/2013/10/24/a-primer-on-owin-cookie-authentication-middleware-for-the-asp-net-developer/), което изглежда даваше най-основния прост пример, който можах да намеря. Така че опитах това, но изглежда все още не успява да създаде сесия за потребителя.

Ето моята конфигурация на бисквитките

public void ConfigureAuth(IAppBuilder app)
    {
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/FooBar")
        });
    }

Ето моето основно персонализирано влизане.

public class LoginController : ApiController
    {
        private IAuthenticationManager Authentication
        {
            get { return Request.GetOwinContext().Authentication; }
        }

        // POST api/login
        public void Post([FromBody]LoginInfo email)
        {
            var fooBar = Authentication.User;
            var claims = new List<Claim>
            {
                new Claim(ClaimTypes.Name, "name")
                ,new Claim(ClaimTypes.Email, "[email protected]")
                ,new Claim(ClaimTypes.Role, "Foo")
            };
            var identity = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie);

            Authentication.SignIn(new AuthenticationProperties() { IsPersistent = true }, identity);
        }
    }

Ако натисна API за влизане два пъти, бих очаквал втория път, че променливата fooBar ще бъде зададена на потребител, който е маркиран като удостоверен, но когато го проверя, той просто казва, че не е удостоверен и няма някое от твърденията, които бих очаквал.

Също така се опитах да създам основна услуга, за да проверя дали е удостоверена, в случай че съм разбрал погрешно как работи, но това също се проваля. Ако се опитам да отида до него, той казва, че не съм удостоверен, не ме пренасочва, както си мислех.

public class TestController : ApiController
    {
        [Authorize(Roles = "Foo")]
        public int Get()
        {
            return 1;
        }
    }

Сигурен съм, че просто пропускам някои основни неща, но досега без значение с какво се занимавах и независимо от различните ръководства и съвети, които съм виждал онлайн, нищо не успя да накара дори този прост сценарий да работи. Някакви идеи какво правя грешно?


person Zipper    schedule 02.12.2013    source източник
comment
Освен това зададохте ли режим на удостоверяване на „Няма“ и премахнахте ли FormsAuthenticationModule в Web.config?   -  person Martin    schedule 02.12.2013
comment
Имах <modules><remove name="FormsAuthenticationModule" /></modules>, но не и удостоверяване, зададено на Няма, зададох удостоверяване на нищо, но все още имам същия проблем.   -  person Zipper    schedule 03.12.2013
comment
Извиква ли се вашият ConfigureAuth метод при стартиране на проекта?   -  person Martin    schedule 03.12.2013
comment
Да, задайте точка на прекъсване на app.UseCookieAuthentication и се задейства при стартиране на сървъра.   -  person Zipper    schedule 04.12.2013
comment
@Zipper Здравей Zipper, имам абсолютно същия проблем като теб. Намерихте ли решение или отговор? Ще бъда много благодарен, ако можете да ми предоставите обратна връзка. Благодаря.   -  person tcode    schedule 30.01.2014


Отговори (2)


В следната публикация http://www.khalidabuhakmeh.com/asp-net-mvc-5-authentication-breakdown има полезни примери за OWIN.

Направих грешка, правилната връзка е: http://www.khalidabuhakmeh.com/asp-net-mvc-5-authentication-breakdown-part-deux И така, ето го с vb подход за основно влизане в бисквитки:

a) Конфигурация на бисквитки.

Imports Microsoft.AspNet.Identity
Imports Microsoft.Owin
Imports Microsoft.Owin.Security.Cookies
Imports Owin

Partial Public Class Startup

    Public Sub ConfigureAuth(app As IAppBuilder)
        app.UseCookieAuthentication(New CookieAuthenticationOptions() With {
        .AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
        .LoginPath = New PathString("/Account/Login")})
    End Sub
End Class

b) Домашен контролер (Наличен начален индекс за авторизирани потребители)

<Authorize>
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    <HttpGet>
    Function Index() As ActionResult
        Return View()
    End Function

End Class

c) Контролер на акаунта (Вход)

Imports System.Security.Claims
Imports System.Threading.Tasks
Imports Microsoft.AspNet.Identity
Imports Microsoft.AspNet.Identity.Owin
Imports Microsoft.Owin.Security

<Authorize>
Public Class AccountController
    Inherits Controller

    Private Function AuthenticationManager() As IAuthenticationManager
        Return HttpContext.GetOwinContext().Authentication
    End Function

    <AllowAnonymous>
    Public Function Login(returnUrl As String) As ActionResult
        ViewBag.ReturnUrl = returnUrl
        Return View()
    End Function

    <HttpPost>
    <AllowAnonymous>
    <ValidateAntiForgeryToken>
    Public Function Login(model As LoginViewModel, returnUrl As String) As ActionResult
        If ModelState.IsValid Then

            If model.UsuarioValido Then 'Local authentication, this must be on Repository class
                Dim Identidad = New ClaimsIdentity({New Claim(ClaimTypes.Name, model.UserName)},
                                                   DefaultAuthenticationTypes.ApplicationCookie,
                                                   ClaimTypes.Name,
                                                   ClaimTypes.Role)

                Identidad.AddClaim(New Claim(ClaimTypes.Role, "Invitado"))

                AuthenticationManager.SignIn(New AuthenticationProperties() With {.IsPersistent = model.RememberMe}, Identidad)

                Return RedirectToAction("index", "home")

            End If
        End If

        Return RedirectToAction("login", model)

    End Function

    <HttpGet>
    Public Function LogOff() As ActionResult
        AuthenticationManager.SignOut()
        Return RedirectToAction("login")
    End Function

End Class

г) Модел на акаунт

Imports System.ComponentModel.DataAnnotations

Public Class LoginViewModel
    <Required>
    <Display(Name:="Nombre de usuario")>
    Public Property UserName As String

    <Required>
    <DataType(DataType.Password)>
    <Display(Name:="Contraseña")>
    Public Property Password As String

    <Display(Name:="¿Recordar cuenta?")>
    Public Property RememberMe As Boolean

    Public ReadOnly Property UsuarioValido As Boolean
        Get
            Return Password = "secreto" 'Password Here!
        End Get
    End Property

End Class

д) Индексен изглед

@Imports Microsoft.AspNet.Identity

@Code
    ViewData("Title") = "Página Inicial"
End Code

<h2>Bienvenido @User.Identity.GetUserName()</h2>

<a href="/[email protected]("LogOff", "Account")">
    Click para salir! (Cerrar Sesión)
</a>

f) Изглед за влизане

@ModelType LoginViewModel

@Code
    ViewBag.Title = "Iniciar sesión"
End Code

<h2>@ViewBag.Title.</h2>
<div class="row">
    <div class="col-md-8">
        <section id="loginForm">
            @Using Html.BeginForm("Login", "Account", New With { .ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, New With {.class = "form-horizontal", .role = "form"})
                @Html.AntiForgeryToken()
                @<text>
                <h4>Utilice una cuenta local para iniciar sesión.</h4>
                <hr />
                @Html.ValidationSummary(True)
                <div class="form-group">
                    @Html.LabelFor(Function(m) m.UserName, New With {.class = "col-md-2 control-label"})
                    <div class="col-md-10">
                        @Html.TextBoxFor(Function(m) m.UserName, New With {.class = "form-control"})
                        @Html.ValidationMessageFor(Function(m) m.UserName)
                    </div>
                </div>
                <div class="form-group">
                    @Html.LabelFor(Function(m) m.Password, New With {.class = "col-md-2 control-label"})
                    <div class="col-md-10">
                        @Html.PasswordFor(Function(m) m.Password, New With {.class = "form-control"})
                        @Html.ValidationMessageFor(Function(m) m.Password)
                    </div>
                </div>
                <div class="form-group">
                    <div class="col-md-offset-2 col-md-10">
                        <div class="checkbox">
                            @Html.CheckBoxFor(Function(m) m.RememberMe)
                            @Html.LabelFor(Function(m) m.RememberMe)
                        </div>
                    </div>
                </div>
                <div class="form-group">
                    <div class="col-md-offset-2 col-md-10">
                        <input type="submit" value="Iniciar sesión" class="btn btn-default" />
                    </div>
                </div>
                </text>
            End Using
        </section>
    </div>

</div>
@Section Scripts
    @Scripts.Render("~/bundles/jqueryval")
End Section
person hcaamal    schedule 06.12.2013
comment
Препоръка: искате да обясните отговорите си, а не само да предоставите връзка към някой друг, който ги е обяснил. По този начин, ако тази страница някога падне или се промени, отговорът все още ще бъде тук. - person neminem; 07.12.2013
comment
Не успях да намеря нищо на тази страница, което да е различно от това, което вече направих. По същество просто обяснява какво вече прави моят код. - person Zipper; 07.12.2013
comment
@Zipper Здравей Zipper, имам абсолютно същия проблем като теб. Намерихте ли решение или отговор? Ще бъда много благодарен, ако можете да ми предоставите обратна връзка. Благодаря. - person tcode; 29.01.2014

И аз съм имал подобни проблеми

Не можах да разбера какво е различното между моето приложение (наследих от някой друг) и примерния код по подразбиране.

Открих, че атрибутът ми [Authorize] не се прилага от рамката, дори когато останалата част от стека за управление на потребители работи.

В крайна сметка разбрах, че AuthorizeAttribute е пример за Filter и че чрез изричното му добавяне в FilterConfig той започна да се използва според очакванията (въпреки че не е добавен от стандартния примерен код):

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
        filters.Add(new AuthorizeAttribute());
    }
}

и всичко както обикновено в метода Application_Start:

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

Редактиране:

Въпреки че това позволява на основния атрибут Authorize да работи, това води до проблем, при който рамката не инстанцира извикването на атрибут за метод с набора от свойства Roles. Така че трябваше да разбера какво е причинило проблема. Това се дължи на някакъв код за настройка на Unity:

var oldProvider = FilterProviders.Providers.Single(f => f is FilterAttributeFilterProvider);
FilterProviders.Providers.Remove(oldProvider);

Премахването на това (то всъщност беше неизползвано) реши проблема, така че вече нямах нужда от FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

person Skym    schedule 18.11.2016