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.
就这些了。
我是网络开发的新手,尤其是网络 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.
就这些了。