C# 如何在没有用户的情况下在Asp.NETMVC中登录客户端
我有一个系统,我使用Asp.Net标识记录有声明的用户。由于我创建了不同的授权过滤器,每个用户对系统功能的访问都不同 我的问题是:这个系统是用于车身和喷漆的管理。它有公司和用户使用Asp.Net身份技术登录。但我需要记录没有用户名或密码的特殊用户,这些用户是公司的客户,必须使用客户车辆的牌照和一些个人信息(如社会安全号码)进行记录 到目前为止,我一直在做的事情是:查找客户是否在一家公司拥有车辆,并验证提供的客户数据是否正确。但是系统在SignInManager.SignInAsync()中失败。它给我的错误是找不到用户ID 这是我的密码:C# 如何在没有用户的情况下在Asp.NETMVC中登录客户端,c#,asp.net,asp.net-mvc,asp.net-mvc-4,asp.net-identity,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Asp.net Identity,我有一个系统,我使用Asp.Net标识记录有声明的用户。由于我创建了不同的授权过滤器,每个用户对系统功能的访问都不同 我的问题是:这个系统是用于车身和喷漆的管理。它有公司和用户使用Asp.Net身份技术登录。但我需要记录没有用户名或密码的特殊用户,这些用户是公司的客户,必须使用客户车辆的牌照和一些个人信息(如社会安全号码)进行记录 到目前为止,我一直在做的事情是:查找客户是否在一家公司拥有车辆,并验证提供的客户数据是否正确。但是系统在SignInManager.SignInAsync()中失败。
if (!ModelState.IsValid)
{
return View(model);
}
var serviceOrder = Repository.ServiceOrders
.Where(so => so.IsActive && so.Vehicle.LicensePlate == model.LicensePlate &&
so.Client.Document.Substring(0, 3) == model.Password)
.OrderByDescending(so => so.CreatedAt).FirstOrDefault();
if (serviceOrder != null)
{
var userId = Guid.NewGuid().ToString();
var user = new ServerModels.User
{
Id = userId,
Name = serviceOrder.Client.Name,
UserName = model.LicensePlate,
SecurityStamp = userId,
Claims =
{
new IdentityUserClaim
{
UserId = userId,
ClaimType = ClaimTypes.Role,
ClaimValue = AppRoleClaims.Client
},
new IdentityUserClaim
{
UserId = userId,
ClaimType = AppAccessClaims.ClientScreenAccess,
ClaimValue = AppAccessClaimsValues.Visualize,
}
}
};
try
{
await SignInManager.SignInAsync(user, model.RememberMe, false);
return Redirect("/cliente/consultarveiculo");
}
catch (Exception ex)
{
ModelState.AddModelError("", "Tentativa de login inválida. - " + ex.Message);
return View(model);
}
以及错误跟踪:
em Microsoft.AspNet.Identity.UserManager`2.<GetSecurityStampAsync>d__42.MoveNext()
--- Fim do rastreamento de pilha do local anterior onde a exceção foi gerada ---
em System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
em System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
em System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
em Microsoft.AspNet.Identity.TaskExtensions.CultureAwaiter`1.GetResult()
em Microsoft.AspNet.Identity.ClaimsIdentityFactory`2.<CreateAsync>d__0.MoveNext()
--- Fim do rastreamento de pilha do local anterior onde a exceção foi gerada ---
em System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
em System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
em System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
em SGOM.Server.Models.User.<GenerateUserIdentityAsync>d__20.MoveNext() na C:\Users\Adalto\Documents\Visual Studio 2015\Projects\MonitoraCar\SGOM\Server\Models\Models\User.cs:linha 25
--- Fim do rastreamento de pilha do local anterior onde a exceção foi gerada ---
em System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
em System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
em System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
em Microsoft.AspNet.Identity.TaskExtensions.CultureAwaiter`1.GetResult()
em Microsoft.AspNet.Identity.Owin.SignInManager`2.<SignInAsync>d__2.MoveNext()
--- Fim do rastreamento de pilha do local anterior onde a exceção foi gerada ---
em System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
em System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
em System.Runtime.CompilerServices.TaskAwaiter.GetResult()
em SGOM.Client.Web.WebApp.Controllers.AccountController.<ClientLogin>d__13.MoveNext() na C:\Users\Adalto\Documents\Visual Studio 2015\Projects\MonitoraCar\SGOM\Client\Web\WebApp\Controllers\AccountController.cs:linha 195
em Microsoft.AspNet.Identity.UserManager`2.d\uu42.MoveNext()
---除gerada外的地方市政管理局职能指令手册---
em System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
em System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务)
em System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
em Microsoft.AspNet.Identity.TaskExtensions.CultureAwater`1.GetResult()
em Microsoft.AspNet.Identity.ClaimsIdentityFactory`2.d_u0.MoveNext()
---除gerada外的地方市政管理局职能指令手册---
em System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
em System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务)
em System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
em SGOM.Server.Models.User.d_u20.MoveNext()na C:\Users\Adalto\Documents\Visual Studio 2015\Projects\MonitoraCar\SGOM\Server\Models\Models\User.cs:linha 25
---除gerada外的地方市政管理局职能指令手册---
em System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
em System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务)
em System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
em Microsoft.AspNet.Identity.TaskExtensions.CultureAwater`1.GetResult()
em Microsoft.AspNet.Identity.Owin.SignInManager`2.d_uu2.MoveNext()
---除gerada外的地方市政管理局职能指令手册---
em System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
em System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务)
em System.Runtime.CompilerServices.TaskAwaiter.GetResult()
em SGOM.Client.Web.WebApp.Controllers.AccountController.d_u13.MoveNext()na C:\Users\Adalto\Documents\Visual Studio 2015\Projects\MonitoraCar\SGOM\Client\Web\WebApp\Controllers\AccountController.cs:linha 195
根据Sam Farajpour Guamari传递的链接,我找到了这个解决方案:
public ActionResult ClientLogin(ClientLoginViewModel model)
{
if (!ModelState.IsValid)
{
return View(model);
}
var serviceOrder = Repository.ServiceOrders
.Where(so => so.IsActive && so.Vehicle.LicensePlate == model.LicensePlate &&
so.Client.Document.Replace(".", "").Replace("-", "").Replace("/", "").Substring(0, 6) == model.Password)
.OrderByDescending(so => so.CreatedAt).FirstOrDefault();
if (serviceOrder != null)
{
try
{
var identity = new ClaimsIdentity(
new[]
{
// adding following 2 claims just for supporting default antiforgery provider
new Claim(ClaimTypes.NameIdentifier, "AnonymousUserID"),
new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "ASP.NET Identity", "http://www.w3.org/2001/XMLSchema#string"),
new Claim(ClaimTypes.Name, serviceOrder.Client.Name),
new Claim(ClaimTypes.Role, AppRoleClaims.Client),
new Claim(AppAccessClaims.ClientScreenAccess, AppAccessClaimsValues.Visualize)
},
DefaultAuthenticationTypes.ApplicationCookie);
HttpContext.GetOwinContext().Authentication.SignIn(
new AuthenticationProperties { IsPersistent = model.RememberMe }, identity);
return Redirect("/cliente/consultarveiculo");
}
catch (Exception ex)
{
ModelState.AddModelError("", "Tentativa de login inválida. - " + ex.Message);
return View(model);
}
}
ModelState.AddModelError("", "Tentativa de login inválida. - Nenhum cliente com a placa e a senha informada.");
return View(model);
}
这非常有效:动态创建声明并使用它们进行身份验证
链接到原始帖子:
这是一个设计问题还是一个bug问题?我不确定我是否理解您的问题。没有用户,但您希望登录该用户。好的,登录的目的是什么?你打算用这个登录名做什么?为什么不在数据库中创建一个用户记录呢?这是一个bug问题,每个公司都有很多用户存储在数据库中,我有一个页面供他们登录,这些用户可以访问可视化数据、更改数据、查看报告和其他内容。但是访问客户端只是为了可视化:客户端必须看到他的汽车是如何维修的,车辆的照片,以及它在公司中经过的阶段。如果身份验证数据库中不存在
ServerModels.User
,您就不能让他登录。想到两种解决方案:-如果客户能够看到非他的车辆上所做的工作并不重要,请添加一个通用用户,该用户将由所有客户共享,用于上述目的。(或允许匿名访问相关操作。)-否则,在其他工作流中的某个位置创建客户用户,例如,当客户最初请求维修汽车时。