C# 如何在没有用户的情况下在Asp.NETMVC中登录客户端

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()中失败。

我有一个系统,我使用Asp.Net标识记录有声明的用户。由于我创建了不同的授权过滤器,每个用户对系统功能的访问都不同

我的问题是:这个系统是用于车身和喷漆的管理。它有公司和用户使用Asp.Net身份技术登录。但我需要记录没有用户名或密码的特殊用户,这些用户是公司的客户,必须使用客户车辆的牌照和一些个人信息(如社会安全号码)进行记录

到目前为止,我一直在做的事情是:查找客户是否在一家公司拥有车辆,并验证提供的客户数据是否正确。但是系统在SignInManager.SignInAsync()中失败。它给我的错误是找不到用户ID

这是我的密码:

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
,您就不能让他登录。想到两种解决方案:-如果客户能够看到非他的车辆上所做的工作并不重要,请添加一个通用用户,该用户将由所有客户共享,用于上述目的。(或允许匿名访问相关操作。)-否则,在其他工作流中的某个位置创建客户用户,例如,当客户最初请求维修汽车时。