5

我想使用ASP.NET SimpleMembership来认证使用我的WebAPI的用户。 Thinktecture具有一个名为Thinktecture.IdentityModel(http://thinktecture.github.com/Thinktecture.IdentityModel.45/)的美妙的身份验证库,其中包含一个将Forms Auth与基本身份验证(source)关联的示例。但是,该示例使用Membership.ValidateUser(),如果没有ASP.NET成员资格提供程序不起作用,SimpleMembership不支持(source)(编辑:这不完全正确,请参阅下面的Mark的回答) 。Thinktecture.IdentityModel with SimpleMembership


编辑

这里就是我所做的:

1)通过的NuGet

3创建一个新的MVC互联网应用

2)安装Thinktecture.IdentityModel)通过脚手架创建模型和api控制器:

public class Goober 
{ 
    public int GooberId { get; set; } 
    public string GooberWords { get; set; } 
} 

4)冉项目,创建新用户以及创建使用招

新落花生

5)添加了[授权]至GetGoober(INT ID)

6)在加入WebApiConfig.cs:

var authConfig = new AuthenticationConfiguration(); 

authConfig.AddBasicAuthentication((userName, password) => 
    Membership.ValidateUser(userName, password)); 

config.MessageHandlers.Add(new AuthenticationHandler(authConfig)); 

当我运行该项目,并打API /落花生/ 1提琴手我得到401 WWW身份验证:未指定。但是如果我先使用AccountController登录然后使用Fiddler,我会得到一个并且一切都很好。

编辑

好吧,我觉得这个问题是不是与我最初的问题。我怀疑它与模板中SimpleMembership的初始化有关。当我打开该项目并运行调试,然后用提琴手点击api我无法通过验证。但是当我只需点击网页前端的“注册”链接时,就可以通过Auth。我猜这是因为InitializeSimpleMembershipAttribute在AccountController被调用,所以直到控制器被调用才初始化?


我已经尝试在Membership.ValidateUser()的地方使用WebSecurity.Login(),但不起作用。

我对如何实际执行此操作感到茫然。有人有建议吗?或者,我试图从错误的角度来解决这个问题?

回答

3

您确定ASP.NET会员提供商与SimpleMembershipProvider不兼容,但SimpleMembershipProvider确实支持ValidateUser,请参阅here。假设SimpleMembership已正确配置并初始化,您应该仍然可以拨打Membership.ValidateUser()

如果您已经尝试Membership.ValidateUser()并且出现错误,请告诉我们,我们可以尝试解决它。

更新

所以有跟着你再现步骤我设法针点错误。将内建的Thinktecture AuthenticationHandler处理程序嵌入并在调试中运行。在向api控制器发出请求之后30秒,正在引发数据库连接错误。这是异步和无声的失败。

经过一番讨论后,我认为它是DefaultConnection错误的连接字符串。

像我默认连接可能包含一个文件名是这样的: AttachDBFilename = | DataDirectory目录| \ ASPNET,MvcApplication3-20121215104323.mdf”

当的ValidateUser时调用的应用程序注册的委托内启动(为验证凭据),这似乎是未能解决|DataDirectory|我发现,通过更新的全名这条道路我的连接问题就走了。

<connectionStrings> 
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-MvcApplication3-20121215104323;Integrated Security=SSPI;AttachDBFilename=C:\mydatabase\file\path\example\aspnet-MvcApplication-20121215104323.mdf" providerName="System.Data.SqlClient" /> 
</connectionStrings> 

然后我发现这个职位here,则表明AppDomain中有没有有它数据目录正确设置在这一点上。

所以一旦配置设置和使用适当的文件路径和用户名“测试”和密码“测试”修改连接字符串通过提琴手这一请求得到了一个200:

GET http://localhost/api/goober/1 
User-Agent: Fiddler 
Host: localhost 
Authorization: Basic dGVzdDp0ZXN0aW5n 

顺便说一下

我发现要获得表单授权令牌也允许访问api控制器我必须添加此。否则Thinkteckture代码设置的原则回匿名:

添加此

authConfig.InheritHostClientIdentity = true; 

为了抵消this(52行):

if (_authN.Configuration.InheritHostClientIdentity == false) 
{ 
    //Tracing.Information(Area.HttpAuthentication, "Setting anonymous principal"); 
    SetPrincipal(Principal.Anonymous); 
} 
+0

嗨,马克 - 感谢您的答复!我没有尝试Membership.ValidateUser(),但无法让它工作。当我回到办公室时,我会在明天更新我的问题。我感谢您的帮助! – brudert

+0

@brudert伟大的东西,让我知道错误是什么为ValidateUser(),我们可以得到修复。 –

+0

谢谢,我用更多的细节更新了我的问题 – brudert