我是Web开发的新手,特别是Web API(休息服务)开发。 我研究了如何使用实体框架和成员资格开发MVC项目。 当我需要使用身份验证和授权时,我只需将AUTHORIZE属性添加到控制器/操作中。 为了添加用户,我在帐户控制器上使用了Register操作。
现在我有一个新项目,它是MVC 5(Visual Studio 2013)中的Web API项目。 我添加了一个使用默认api操作的新用户 - Register(使用fidler)。 现在,我试图简单地使用get方法来读取一些数据,但是当添加AUTHORIZE属性并添加正确的用户名和密码时,我会继续获得401(未经授权的)响应。 然后我创建了这个帖子:
ASP.NET MVC 4 Web API Authentication with Membership Provider
Bur现在,方法Membership.ValidateUser(用户名,密码)总是返回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()
);
}
}
提前致谢, 沙乌尔
答案 0 :(得分:1)
在Web.Config中定义Membership数据库,如下所示:
<connectionStrings>
<add name="test_connStr" connectionString="" />
</connectionStrings>
<system.web>
<membership defaultProvider="test_provider">
<providers>
<clear />
<add name="test_provider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="test_connStr" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" passwordAttemptWindow="10" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="0" applicationName="/" />
</providers>
</membership>
</system.web>
将connectionString
设置为Membership数据库连接字符串。
connectionStringName
应该是定义的连接字符串的名称。
编辑:
对不起,我有点迟了。检查aspnet_SchemaVersions
表的内容。它应包含以下内容:
common 1 True health monitoring 1 True membership 1 True personalization 1 True profile 1 True role manager 1 True
如this回答所示。
答案 1 :(得分:0)
为了使用简单的成员资格提供程序,我使用了这个简单的教程: http://monox.mono-software.com/blog/post/Mono/226/Adding-ASP-NET-SimpleMembership-to-an-existing-MVC-4-application/ 但它仍然有一个简单的错误,通过添加Nuget包解决了: Microsoft.AspNet.WebHelpers。
就是这样。