在前端存储用户凭据的位置

时间:2014-07-20 07:39:28

标签: asp.net authentication asp.net-web-api

在登录算法的ASP.NET web API中,我有一个动作过滤器,为每个用户生成一个令牌,前端通过在Web服务器中使用该令牌将该令牌发回以验证用户我可以获得当前用户信息到现在为止每件事情都工作正常但是我有新的要求,即每个用户与帐户有多对多的关系,这意味着同一个用户可以存在于多个具有不同角色的帐户中,例如在帐户中,他是帐户2中的管理员他是普通用户所以我必须重新生成令牌,这需要用户再次登录我不希望他再次被重定向到登录页面。我想到的是在html 5本地存储中存储用户名和密码,但我认为这是一个不好的做法任何想法。 她是我如何生成令牌。

public override void OnActionExecuting(HttpActionContext actionContext)
{
    if (!actionContext.Request.Headers
           .Any(header => header.Key == "AuthorizationHeader"))
    {
        if (this.IsAnonymousAllowed(actionContext) == false)
        {
            actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized, "Un Autherized");
        }
    }
    else
    {
        string token = actionContext.Request.Headers
         .Where(header => header.Key == "AuthorizationHeader")
         .First().Value.First();
        if (this.IsAnonymousAllowed(actionContext) == true)
        {
            return;
        }

        string passPhrase = System.Configuration.ConfigurationSettings.AppSettings["PassPhrase"];
        string ticket_string = Crypto.Decrypt(token, passPhrase);

        TicketData ticket = JsonConvert.DeserializeObject<TicketData>(ticket_string);

        if (ticket == null || ticket.Expiration < DateTime.Now)
        {
            actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized, "UnAuthorized");
        }
        else
        {
            OurIdentity identity = (OurIdentity)ticket.TokenData.OurIdentity;

            System.Threading.Thread.CurrentPrincipal = new OurPrincipal
            {
                OurIdentity = identity,
            };
        }
    }
} 

2 个答案:

答案 0 :(得分:0)

您在本地存储中保存用户名和密码是对的。将它保存在客户端的任何地方都是不好的。

通常生成令牌并将其放入cookie中。该令牌对应于服务器上的记录,在会话日志或数据库中。

我强烈建议您使用现有方法,例如OAUTH Bearer tokens in this tutorial

答案 1 :(得分:0)

据我所知,如果你要存储一个哈希(可能带有一个用于额外保护的盐),那么存储凭证并不是很糟糕。无论如何,这些都必须存储在某一天的某个地方。