C# NET内核。如何在没有身份用户帐户的情况下创建身份验证cookie?

C# NET内核。如何在没有身份用户帐户的情况下创建身份验证cookie?,c#,asp.net-mvc,asp.net-core,C#,Asp.net Mvc,Asp.net Core,我的应用程序创建一个Guid事件令牌 客户访问活动的url时会这样做。 然后将客户重定向到登录表单以提供事件密码 如果密码无效,则事件令牌客户将能够看到事件。 我可以在没有身份用户帐户的情况下进行密码转换吗?(在本例中,我不希望遵循经典的用户身份登录方法) 可能类似于创建一个auth cookie并在接下来的请求中使用它 [HttpPost] [Route("validate/{code}")] public IActionResult Cookie(string code

我的应用程序创建一个
Guid
事件令牌

客户访问活动的url时会这样做。

然后将客户重定向到登录表单以提供事件密码

如果密码无效,则事件令牌客户将能够看到事件。 我可以在没有身份用户帐户的情况下进行密码转换吗?(在本例中,我不希望遵循经典的用户身份登录方法)

可能类似于创建一个auth cookie并在接下来的请求中使用它

[HttpPost]
[Route("validate/{code}")]
public IActionResult Cookie(string code)
{
    var user = true;  //Validate event token against event password supplied by user 
    if (user == true)
    {
        var ident = _userManager.CreateAuthCookie(user, DefaultAuthenticationTypes.ApplicationCookie);

        HttpContext.GetOwinContext().Authentication.SignIn(new AuthenticationProperties { IsPersistent = false }, ident);
        
        return Redirect("Wherever");
    }
    ModelState.AddModelError("", "Invalid login attempt");
    return View();
}

我想,我理解你的意思。您希望在身份验证框架中创建自定义Owin。使用JWT令牌也可以实现同样的效果。它比OWIN身份验证具有优势

但如果您想使用OWIN设计类似的东西,请注意以下几点:

  • 首先也是最重要的一点,在url中传递的参数不应该有任何密码或敏感值。URL令牌应该被编码(对于编码,u可以引用),并且编码的令牌可以携带此信息。编码时,您可以对someID(不是电子邮件地址)、某个sourcecd(告诉令牌来自有效源)、某个时间限制以及该令牌有效的次数进行编码
现在,当您获得对API端点的调用时,您可以解码该令牌,验证并提取该someID,然后调用DB以了解用户是否有效

重要:编码和解码算法在这里起着非常重要的作用。因此,您的编码和解码令牌不应该暴露在任何地方

如果他是有效用户,则创建ClaimSideEntity对象

ClaimsIdentity identity = new ClaimsIdentity();
identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, identity.FindFirst("sub").Value));
identity.AddClaim(new Claim("Name", <<add your claims like this>>));
identity = new ClaimsIdentity(identity.Claims, "ApplicationCookie");

AuthenticationProperties properties = new AuthenticationProperties();
AuthenticationManager.SignIn(properties, identity);

您还应该在中间层中配置OWIN层。您可以基于.Net framework或.Net Core在中间层配置OWIN,目标是创建一个身份验证令牌,对吗?它可以通过验证GUID或标识用户帐户来实现。@MiteshPrajapati实际上没有用户帐户。目标是使用用户提供的url令牌和密码(如果组合匹配)创建一个身份验证cookie,而不是设置GUID,您可以创建JWT令牌并将所有信息放入其中。在登录而不是根据数据库进行验证时,您可以根据JWT令牌进行验证,并在所有验证都得到验证的情况下创建实际的身份验证令牌。我当然希望您在
code
中不要以纯文本形式发送密码。。。
using Microsoft.Owin.Security;

        private IAuthenticationManager authenticationManager;
        public IAuthenticationManager AuthenticationManager
        {
            get
            {
                if (authenticationManager == null)
                    authenticationManager = HttpContext.GetOwinContext().Authentication;
                return authenticationManager;
            }
            set { authenticationManager = value; }
        }