ASP.Net 具有成员身份的 MVC 基本身份验证

ASP.Net MVC basic authentication with membership

我是网络开发的新手,尤其是网络 API(休息服务)开发。 我研究了如何使用 entity framework 和成员资格开发 MVC 项目。 当我需要使用身份验证和授权时,我只需将 AUTHORIZE 属性添加到 controller/action。 为了添加用户,我在帐户控制器上使用了注册操作。

现在我有一个新项目,它是 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()
);
    }
}

提前致谢, 沙尔

在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 table 的内容。它应该包含以下内容:

common              1   True
health monitoring   1   True
membership          1   True
personalization     1   True
profile             1   True
role manager        1   True

this答案所示。

为了使用简单的会员提供程序,我使用了这个简单的教程: http://monox.mono-software.com/blog/post/Mono/226/Adding-ASP-NET-SimpleMembership-to-an-existing-MVC-4-application/ 但它仍然有一个简单的错误,通过添加 Nuget 包解决了: Microsoft.AspNet.WebHelpers.

就这些了。