Аутентифицировать пользователя в ASP.NET MVC с удостоверениями - PullRequest
0 голосов
/ 28 сентября 2018

Я очень озадачен тем, как работает настоящая аутентификация, поэтому [Authorize] не перенаправляет меня на страницу входа.

Вот моя конфигурация:

public class IdentityConfig
{
    public void Configuration(IAppBuilder app)
    {
        app.CreatePerOwinContext(() => new MyANTon.DataContext.AntContext());
        app.CreatePerOwinContext<UserManager>(UserManager.Create);
        app.CreatePerOwinContext<RoleManager<AppRole>>((options, context) =>
            new RoleManager<AppRole>(
                new RoleStore<AppRole>(context.Get<MyANTon.DataContext.AntContext>())));

        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Home/Login"),
        });
    }
}

В контроллереЯ хочу вызвать Authenticate(string Email, String Password) метод, аутентифицировать пользователя и вернуть bool.Однако я понятия не имею, как работает настоящая аутентификация.В FormsAuthentication я бы создал тикет, что мне делать для идентификации?

Вот что у меня есть:

public static async System.Threading.Tasks.Task<bool> AuthUserAsync(string Email, string Password)
    {
        using (var db = new AntContext())
        {

            string hashedPW = GetHash(Password);
            bool userValid = db.Users.Any(user => user.Email == Email && user.Password == hashedPW);
            if (userValid)
            {
                var actUser = db.Users.FirstOrDefault(u => u.Email == Email && u.Password == hashedPW);
                if (actUser != null && !actUser.IsLocked)                   
                {
                    /** What do I do here? **/
                }
                else if (actUser.IsLocked)
                {
                    LoggingServices.AuthLog(actUser.Email, "Hat versucht auf ein gesperrtes Konto zuzugreifen.");
                }
            }
            return false;
        }
    }

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Вы движетесь в правильном направлении, то, что вы делаете, это своего рода использование OAuth для облегчения сопоставления ваших токенов и предоставления OWin возможности обрабатывать информацию браузера.Итак, используя атрибут [Authorize], как вы это делаете, как вы справляетесь с подписью удостоверения личности?Как упоминалось выше при проверке подлинности с помощью форм, вам все равно необходимо создать токен Identity / Claim.В моих проектах я делаю что-то вроде этого,

   protected void IdentitySignin(IUserModel userModel, string providerKey = null, bool isPersistent = true)
        {
            var claims                                                         = new List<Claim>
            {
                new Claim(ClaimTypes.NameIdentifier, userModel.Id.ToString()),
                new Claim(ClaimTypes.Name, userModel.UserName),
                new Claim("UserContext", userModel.ToString())
            };
            var identity                                                       = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie);
            AuthenticationManager.SignIn(new AuthenticationProperties
            {
                IsPersistent                                                   = isPersistent,
                ExpiresUtc                                                     = DateTime.UtcNow.AddDays(7)
            }, identity);
        }

Это вынуждает OWIN / OAuth войти в систему пользователя, и в моем web.config у меня есть следующее:

<system.webserver>
    <authentication mode="None" />
</system.webserver>

Ичтобы выйти из моего пользователя и заставить браузер получить новый токен:

 protected void IdentitySignout()
        {
            AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie,
                                            DefaultAuthenticationTypes.ExternalCookie);
        }

Мой AuthenticationManager определен так:

   private IAuthenticationManager AuthenticationManager
        {
            get { return HttpContext.GetOwinContext().Authentication; }
        }

, который является частью Microsoft.OWin.IOwinContext, вам придется добавить ссылку, если она не существует.

Вы можете обработать неавторизованного пользователя через файл web.config или base-controller, я выбрал опцию base-controller следующим образом:

protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (UserContext == null || UserContext.Id.Equals(Guid.Empty))
            {
                if (filterContext.Controller.GetType()     == typeof(AccountController) || filterContext.Controller.GetType() == typeof(HomeController)) return;
                filterContext.Result                       = new RedirectResult("/Home/Index");
                return;
            }
}

Но вы также можете сделать это через AuthorizeAttribute, если хотите.Эта ссылка подробно расскажет о работе с Oauth и Asp.Net MVC, поначалу может показаться сложной, но она дает отличную схему использования других провайдеров, если вы решили включить их в выпускную версию.

https://www.codeproject.com/Articles/577384/Introduction-to-OAuth-in-ASP-NET-MVC

0 голосов
/ 28 сентября 2018

Когда вы хотите Login для вашего web-site, вы отправляете свой token на client, и вы можете работать с ним для запроса и ответа во многих, иными словами, вы должны войти на серверную сторону.

Но если вы хотите logout из web-site, ваш клиент должен знать, что вы хотите logout, это не работает только для сервера, клиент должен сделать эту проблему для выхода из системы.

Я хочу предложить вам Token-JWT

, если вы хотите знать о JWT, нажмите здесь

Если вы хотите, я создам Пример длявы.

...