如何使用asp.net mvc实现自动用户登录
本文关键字:用户 登录 实现 mvc 何使用 asp net | 更新日期: 2023-09-27 18:13:53
我们使用mvc框架6,身份框架3和EF 7与sql server。web应用需要用户身份验证和授权。但有一种情况,当我们想从查询字符串验证/授权用户。我在创建usermanager/signinmanager有问题。这是login
的AccountController的样子[Authorize]
public class AccountController : Controller
{
private readonly ApplicationDbContext _dbContext;
public AccountController(ApplicationDbContext dbContext, UserManager<ApplicationUser> userManager, SignInManager<ApplicationUser> signInManager)
{
_dbContext = dbContext;
UserManager = userManager;
SignInManager = signInManager;
}
public UserManager<ApplicationUser> UserManager { get; private set; }
public SignInManager<ApplicationUser> SignInManager { get; private set; }
//
// GET: /Account/Login
[HttpGet]
[AllowAnonymous]
public IActionResult Login(string returnUrl = null)
{
ViewBag.ReturnUrl = returnUrl;
return View();
}
//
// POST: /Account/Login
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{
ViewBag.ReturnUrl = returnUrl;
if (ModelState.IsValid)
{
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, set shouldLockout: true
var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
if (result.Succeeded)
{
return RedirectToLocal(returnUrl);
}
if (result.RequiresTwoFactor)
{
return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
}
if (result.IsLockedOut)
{
return View("Lockout");
}
else
{
ModelState.AddModelError(string.Empty, "Invalid username or password.");
return View(model);
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
对于从URL字符串自动登录,我想创建或实例化SigninManager对象到我,所以我可以使用PasswordSignInAysync方法。但我不知道该怎么做。这是我所拥有的,但我不确定要传递的参数。
[HttpGet]
public async Task<IActionResult> Index()
{
//from url
if(Request != null)
{
if(Request.Query["emailId"] != null)
{
var store = new UserStore<ApplicationUser>(_dbContext);
var manager = new UserManager<ApplicationUser>(store,null,null,null,null,null,null,null,null,null);
//var userstore = new IUserStore(ApplicationUser);
//var user = new UserManager();
var user = new ApplicationUser { UserName = "someone@XXX.com" };
var signinmanager = new SignInManager<ApplicationUser>(manager,);
var result = await SignInManager.PasswordSignInAsync(Request.Query["emailId"],
Request.Query["TokenId"], false, shouldLockout: false);
if (result.Succeeded)
{
return RedirectToAction("MyHome", "People");
}
return RedirectToAction("MyHome", "People");
}
}
}
根据评论中的对话回答:我的建议是,为此你创建一个自定义登录端点它接受loginid,这样在你向客户端展示完网站后,你可以撤销那个id,并在未来停止非授权访问。
我很抱歉,但是我不完全记得你是如何自定义登录端点的,我知道有一些关于设置用户的授权。
但是一旦你弄清楚如何授权用户,在潜在客户端的用户身份上创建一个新的声明,从那里你可以创建一个动作过滤器,使潜在客户端的人只能访问具有允许潜在客户端的自定义过滤器的端点。
如果我发现你授权的方式,我会把它传回给你,我没有使用登录管理器,虽然如果我没记错的话,它的东西很简单,就像设置一些东西为true..我希望我能记起来,但它总是躲着我。
希望能有所帮助