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

标签 c# asp.net database authentication asp.net-web-api

我正在尝试为我的网络 API 实现身份验证。 我已经阅读了不同的 api 身份验证技术, token 技术对我来说是最合理的。

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

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

(顺便说一下,我的项目是建立在一个空的web api 项目之上的,所以它没有附带所有的 Bootstrap 和身份验证类)。

谢谢

最佳答案

我见过的一种解决方案是使用 .NET 的 HttpApplicationState在 appstate 中分类和存储 token ;这样你就不会直接弄乱 session (这将是一个 REST 反模式),但你仍然可以跟踪所有当前登录的用户并使用 HttpContext/HttpActionContext 来外部引用应用程序中的事件 token 。使用 HttpActionContext 的好处是它是线程安全的,而 HttpContext 不是,因此您可以锁定 appstate,扰乱单个请求的 HttpContext,然后解锁 appstate 以允许其他线程进入。

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

大纲: 当用户首次登录时,会为他/她生成一个 token 并存储在 appstate 中。然后,您可以使用自定义属性标记任何需要身份验证(或需要存储在该用户的其他信息)的 API 调用,该属性在应用程序状态中检查该 token ,将 token 名称作为 header 发送到 API 调用中(例如“{token -名称: token }”)。

这是一个简单的例子:

[在登录时首次激活的 Controller 方法中:]

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;
}

[然后在 webapi 中]

[HttpPost]
[CustomAuthorize]
public HttpResponseMessage NameOfMethod(...)...

...这应该会为您检查您的用户 token 的应用程序状态。只需确保在您的请求 header 中包含您的 token ,并确保在您的响应 header 中包含基本身份验证信息。

关于c# - ASP.NET Web Api 身份验证方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31939923/

相关文章:

c# - 组合框中的两个项目相同但第一个总是被选中 C#

c# - 添加两个 .NET SqlDecimals 会提高精度吗?

asp.net - 从 asp.net 中的存储过程中检索记录

php - 如何用php将表单数据提交到特定数据库,我的参数有什么问题?

database - React Native [iOS] 数据库选项

c# - lock 语句中还需要 volatile 吗?

c# - 如何将一个大型 MVC 4 应用程序划分为多个较小的应用程序?

c# - 异步编程与线程有何不同?

asp.net - IIS 7 日志文件自动删除?

database - 在数据库列中存储分隔列表真的那么糟糕吗?