具有成员资格的ASP.Net MVC基本认证

时间:2015-08-04 12:03:16

标签: asp.net-mvc rest asp.net-membership membership-provider restful-authentication

我是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()
);
    }
}

提前致谢, 沙乌尔

2 个答案:

答案 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。

就是这样。