C# ASP.NET Web Api身份验证方法

C# ASP.NET Web Api身份验证方法,c#,asp.net,database,authentication,asp.net-web-api,C#,Asp.net,Database,Authentication,Asp.net Web Api,我正在尝试为我的web api实现身份验证。 我读过关于api身份验证的不同技术,令牌技术对我来说是最合理的 我读过关于如何在asp.net中实现基于令牌的身份验证的不同文章,但它们都依赖于不同的库,例如OAuth或Owin,它们也提供了自己的数据库交互方法 问题是,我已经实现了与抽象存储库和实体的数据库交互,我想了解如何在不干扰当前设计的情况下轻松、简单地实现api身份验证 (顺便说一句,我的项目是在一个空的web api项目上构建的,因此它没有附带所有的引导和身份验证类) 谢谢我看到的一个解

我正在尝试为我的web api实现身份验证。 我读过关于api身份验证的不同技术,令牌技术对我来说是最合理的

我读过关于如何在asp.net中实现基于令牌的身份验证的不同文章,但它们都依赖于不同的库,例如OAuth或Owin,它们也提供了自己的数据库交互方法

问题是,我已经实现了与抽象存储库和实体的数据库交互,我想了解如何在不干扰当前设计的情况下轻松、简单地实现api身份验证

(顺便说一句,我的项目是在一个空的web api项目上构建的,因此它没有附带所有的引导和身份验证类)


谢谢

我看到的一个解决方案是使用.NET类并在appstate中存储令牌;这样,您就不会直接干扰会话(这将是一个REST反模式),但您仍然可以跟踪所有当前登录的用户,并使用HttpContext/HttpActionContext在应用程序中使用x-ref活动令牌。使用HttpActionContext的好处是它是线程安全的,而HttpContext不是,因此您可以锁定appstate,处理单个请求的HttpContext,然后解锁appstate以允许其他线程进入

由于锁定/解锁appstate确实会占用应用程序,我不确定此解决方案的可扩展性如何,但无论如何,它在这里

概述: 当用户首次登录时,会为其生成一个令牌并存储在appstate中。然后,您可以使用一个自定义属性标记任何需要身份验证(或需要该用户上存储的其他信息)的API调用,该属性在appstate中检查该令牌,并将令牌名称作为API调用中的头发送(例如“{token name:token}”)

下面是一个简单的例子:

[在登录时首次激活的控制器方法中:]

CustomUserObject user = new CustomUserObject();

//store user props

string token = Guid.NewGuid().ToString();

//create AppState instance, mine's called _appState
//...
_appState.Lock();
_appState[token] = user;
_appState.UnLock();
//...
[然后在global.asax:]

public class CustomAuthorize : System.Web.Http.AuthorizeAttribute
{
    HttpRequestMessage request = actionContext.ControllerContext.Request;
    string token = string.Empty;

    if (request.Headers.GetValues("token-name") != null)
    {
        token = request.Headers.GetValues("token-name").FirstOrDefault().ToString();

        IAppStateService appService; //<--- I've created a custom service tier class for appstate stuff

        //Get appState instance, however makes sense for you.
        //I'm using repo pattern with UnitOfWork, so mine looks like this...
        //"IContainer ioc = DependencyResolution.IoC.Initialize();"
        //"IAppStateService appService = ioc.GetInstance<IAppStateService>();"
        appService.SetHttpApplicationState(HttpContext.Current.Application);

        bool isAuthorized = appService.CheckTokenAndDoStuff(token);

        //inside that method ^^^ you'll do stuff like
        //"_appState.Lock();"
        //"if (_appState[token] == null) return false" (or whatever)
        //"_appState.Unlock();"
    }

    if (isAuthorized)
    {
        HttpResponseMessage resp = request.CreateResponse(HttpStatusCode.OK);

        resp.Headers.Add("AuthenticationToken", token);
        resp.Headers.Add("WWW-Authenticate", "Basic");
        resp.Headers.Add("AuthenticationStatus", "Authorized");
    }

    return isAuthorized;
}

…这应该为您的用户令牌检查您的appstate。只需确保在请求标头中包含您的令牌,并确保在响应标头中包含基本的身份验证信息。

Taiseer Joudeh的系列文章对我的帮助很大。这里有一个链接,也许它也能帮助你。@RonaldRozema问题是他们不想使用Owin。这看起来是一个很好的解决方案,但不是在应用程序状态下保存令牌的部分。也许我应该把它保存在数据库里?
[HttpPost]
[CustomAuthorize]
public HttpResponseMessage NameOfMethod(...)...