首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebAPI认证

WebAPI认证
EN

Code Review用户
提问于 2016-05-15 02:10:14
回答 1查看 1.1K关注 0票数 2

您认为这种身份验证方法存在任何安全问题或有任何建议吗?

WebAPI是基于REST的.用户通过调用身份验证控制器( Authentication )登录,如果未经过身份验证,则期望401或在头中有一个会话令牌的200。

GitHub

代码语言:javascript
复制
Session session = null;
try
{
    session = Models.User.Login(user);
}
catch (Exception ex)
{
    var errResponse = new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized)
    {
        Content = new StringContent("Invalid Username or Password"),
        ReasonPhrase = ex.InnerException.ToString()
    };
    throw new HttpResponseException(errResponse);
}

在除身份验证之外的每一次呼叫中,请求都会被截获,并期望有一个会话头。如果数据库中存在会话,则对请求进行身份验证。

代码语言:javascript
复制
protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
    try
    {
        //Unauthorized
        if (HttpContext.Current.Request.Headers[SessionHeader] == null)
        {
            var errResponse = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden)
            {
                Content = new StringContent(SessionError),
                ReasonPhrase = SessionError
            };
            return errResponse;

        }

        string sessionHeader = HttpContext.Current.Request.Headers[SessionHeader];


        Session session = Session.Lookup(sessionHeader);

        if (session == null)
        {
            throw new SecurityException("No session record exists");
        }
        else if (session.Expired)
        {
            throw new SecurityException("Session Expired");
        }
        else
        {
            session.LastAccess = DateTime.Now;
            session.Save();
            var identity = new SecurityPrincipal(session);
            Thread.CurrentPrincipal = identity;
            HttpContext.Current.User = identity;

        }

会话查找是使用实体框架完成的

代码语言:javascript
复制
public static Session Lookup(string sessionId) {
    using (var context = new SingleAppContextCustom())
    {
        var session = (from s in context.Sessions.IncludeChildren()
                        where s.SessionId == sessionId
                        select s).FirstOrDefault();

        return session;
    }
}
EN

回答 1

Code Review用户

发布于 2016-08-02 19:17:37

通常,您希望尽可能少地提供为什么拒绝访问的信息。因此,我会将这一节代码修改为:

代码语言:javascript
复制
if (session == null || session.Expired)
{
    throw new SecurityException("Access Denied");
}

据推测,此异常将转换为适当的HTTP状态代码。

SendAsyc是一个执行安全性的函数的奇怪名称,但是您可能有这样做的原因。尽管如此,似乎缺少了一些东西,因为我不知道它在哪里,或者返回一个Task

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/128392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档