【发布时间】:2015-10-26 19:58:32
【问题描述】:
我是 Web 开发新手,尤其是 Web API(rest 服务)开发。 我研究了如何使用实体框架和成员资格开发 MVC 项目。 当我需要使用身份验证和授权时,我只需将 AUTHORIZE 属性添加到控制器/操作。 为了添加用户,我在 Account 控制器上使用了 Register 操作。
现在我有一个新项目,它是 MVC 5 (Visual Studio 2013) 中的 Web API 项目。 我使用默认的 api 操作添加了一个新用户 - 注册(使用 fidler)。 现在,我试图简单地使用 get 方法来读取一些数据,但是在添加 AUTHORIZE 属性并添加正确的用户名和密码时,我不断收到 401(未经授权)响应。 然后我创建了这个线程:
ASP.NET MVC 4 Web API Authentication with Membership Provider
现在,方法 Membership.ValidateUser(username, password) 总是返回 false,我假设我必须定义会员数据库,我在哪里做呢?
这里是完整的代码:
using System;
using System.Net.Http;
using System.Security.Principal;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
using System.Web.Security;
public class BasicAuthenticationMessageHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var authHeader = request.Headers.Authorization;
if (authHeader == null)
{
return base.SendAsync(request, cancellationToken);
}
if (authHeader.Scheme != "Basic")
{
return base.SendAsync(request, cancellationToken);
}
var encodedUserPass = authHeader.Parameter.Trim();
var userPass = Encoding.ASCII.GetString(Convert.FromBase64String(encodedUserPass));
var parts = userPass.Split(":".ToCharArray());
var username = parts[0];
var password = parts[1];
if (!Membership.ValidateUser(username, password))
{
return base.SendAsync(request, cancellationToken);
}
var identity = new GenericIdentity(username, "Basic");
string[] roles = Roles.Provider.GetRolesForUser(username);
var principal = new GenericPrincipal(identity, roles);
Thread.CurrentPrincipal = principal;
if (HttpContext.Current != null)
{
HttpContext.Current.User = principal;
}
return base.SendAsync(request, cancellationToken);
}
}
这里是我添加处理程序的地方:
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
GlobalConfiguration.Configuration.MessageHandlers.Add(
new BasicAuthenticationMessageHandler()
);
}
}
提前致谢, 修罗
【问题讨论】:
-
如果是 WebAPI 项目 - 检查 app_start 和 StartUp.cs 中的 IdentityConfig
-
这是一个webAPI项目,检查什么?
-
您在上下文中设置了什么,您的 ApplicationManager 是什么,并检查您在控制器中使用的内容。如果您仍然需要帮助,我会在几个小时内写信
标签: asp.net-mvc rest asp.net-membership membership-provider restful-authentication