身份在 Asp .Net MVC 5 中如何工作

问题描述 投票:0回答:2

假设我有一个包含用户名/密码的 SQL Server 数据库。在我的“登录”视图中,我希望在用户名/密码文本字段中输入数据,当我单击“登录”时,我想使用我的登录控制器将这些值与数据库中的值进行比较。所有这些都相当简单:

但是,我想在站点控制器的其余部分上使用

[Authorize]
属性。在通过登录页面授予访问权限后,我似乎找不到任何示例来解释如何“授权”用户,以便
["Authorize"]
属性识别该用户并允许他们访问其他控制器/操作。这是我开始设置的方式,但我找不到任何关于从这里开始的方向。

public class LoginController : Controller
{
    // GET: /<controller>/
    //[Route("/Login")]
    public ActionResult Index()
    {
        return View();
    }

    public bool Login(Workflow.Models.WorkflowContext wfc, string username, string password)
    {
        var user = wfc.User.Where(u => u.Active && u.Username == username && u.Password == password).ToList();
        if (user.Count > 0)
        {               
            //User may log in
            return true;
        }
        else
            //Access Denied
            return false;
    }
}

例如,在没有授权用户的情况下,我不希望他们能够访问我的“家庭控制器”:

[Authorize]
public class HomeController : Controller
{ 
    [Route("/Home")]
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult About()
    {
        ViewData["Message"] = "Your application description page.";

        return View();
    }

    public ActionResult Contact()
    {
        ViewData["Message"] = "Your contact page.";

        return View();
    }

    public ActionResult Error()
    {
        return View();
    }
}

我听说过“Identity”和“SignInManager”类,我对如何使用这些选项感到有点不知所措。我对 ASP .Net MVC 还是有点陌生,所以我试图了解授权的工作原理。谢谢。

c# asp.net asp.net-mvc asp.net-mvc-4 asp.net-identity
2个回答
5
投票

身份验证/授权比简单地验证用户名和密码一次要复杂得多。 ASP.NET Identity 是 ASP.NET 应用程序可用于处理身份验证/授权的几种不同机制之一,也是个人用户身份验证的推荐方法。它取代了更旧的 ASP.NET 会员资格。 SignInManager 只是 ASP.NET Identity 的一个类,它处理诸如登录用户之类的事情(显然)。这不是一些单独的事情。

有了这个,您就必须深入研究。您绝对不想尝试从头开始创建自己的系统,并且展望未来,身份几乎是身份验证和授权的主要方法在 ASP.NET 中。现在就学习它,您将能够使用大多数 ASP.NET 站点,并且能够将您的知识应用到您创建的任何新 ASP.NET 站点。

https://www.asp.net/identity

开始您的旅程。那里列出了许多很好的教程和指南,并从那里链接到(请务必查看其他资源)。此外,您还需要创建一个新的 MVC 项目并选择“个人用户帐户”。这将为您提供一个包含基本 Identity 内容的脚手架项目。您还可以全力以赴创建一个空白的 MVC 项目,然后安装 Identity Samples Nuget 包。这将创建一个几乎包含 Identity 中所有功能的脚手架项目(双因素身份验证、第三方 OAuth 登录等)。这样您就可以很好地了解一切是如何运作的。

public class AuthController : Controller { SignInManager<AppUser> _signInManager { get; set; } UserManager<AppUser> _userManager { get; set; } RoleManager<IdentityRole> _roleManager { get; set; } public AuthController(SignInManager<AppUser> signInManager, UserManager<AppUser> userManager, RoleManager<IdentityRole> roleManager) { _signInManager = signInManager; _userManager = userManager; _roleManager = roleManager; } public IActionResult Register() { return View(); } [HttpPost] public async Task<IActionResult>Register(RegisterVm vm) { if(!ModelState.IsValid) { return View(vm); } var user = new AppUser() { Email = vm.Email, Surname = vm.Surname, Name = vm.Name, UserName = vm.Username }; var result = await _userManager.CreateAsync(user,vm.Password); if (!result.Succeeded) { foreach (var error in result.Errors) { ModelState.AddModelError("", error.Description); return View(); } } return View(); } public async Task<IActionResult> Login() { return View(); } [HttpPost] public async Task<IActionResult>Login(string? returnUrl,LoginVm vm) { AppUser user; if(!ModelState.IsValid) { return View(vm); } if (vm.UsernameorEmail.Contains("@")) { user = await _userManager.FindByEmailAsync(vm.UsernameorEmail); } else { user= await _userManager.FindByNameAsync(vm.UsernameorEmail); } if(user != null) { var result = await _signInManager.PasswordSignInAsync(user, vm.Password, vm.isRemember, true); if (!result.Succeeded) { ModelState.AddModelError("", "Invalid Login attempt"); return View(); } } else { ModelState.AddModelError("", "Login Not Found"); return View(); } if (returnUrl != null) { return LocalRedirect(returnUrl); } return RedirectToAction("Index", "Home"); } public async Task<IActionResult> Logout() { await _signInManager.SignOutAsync(); return RedirectToAction("Index", "Home"); } public async Task<bool> CreateRoles() { foreach (var item in Enum.GetValues(typeof(Roles))) { if (!await _roleManager.RoleExistsAsync(item.ToString())) { await _roleManager.CreateAsync(new IdentityRole { Name = item.ToString(), }); } return true; } return false; } }

0
投票

© www.soinside.com 2019 - 2024. All rights reserved.