【问题标题】:ASP.Net MVC basic authentication with membership具有成员资格的 ASP.Net MVC 基本身份验证
【发布时间】: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


【解决方案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 表的内容。它应包含以下内容:

常见 1 真 健康监测 1 真 会员 1 真 个性化 1 真 配置文件 1 真 角色管理器 1 真

this答案所示。

【讨论】:

  • 我这样做了,现在我得到以下信息:需要与架构版本“1”兼容的数据库架构。但是,当前的数据库架构与此版本不兼容。您可能需要安装与 aspnet_regsql.exe 兼容的架构(可在框架安装目录中获得),或者将提供程序升级到更新版本。
  • 我的数据库是由 MVC 3 架构创建的
  • 好的,看来,我的数据库架构是简单的成员,我该如何更改提供者?
【解决方案2】:

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

就是这样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-15
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 2012-07-17
    • 2014-07-05
    • 1970-01-01
    相关资源
    最近更新 更多