首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Thinktecture.IdentityModel与SimpleMembership

Thinktecture.IdentityModel与SimpleMembership
EN

Stack Overflow用户
提问于 2012-12-14 22:09:13
回答 1查看 3K关注 0票数 5

我想使用ASP.NET SimpleMembership对使用我的WebAPI的用户进行身份验证。Thinktecture有一个很好的身份验证库,名为Thinktecture.IdentityModel (http://thinktecture.github.com/Thinktecture.IdentityModel.45/),示例将Forms Auth与Basic (来源)联系起来。但是,该示例使用的是Membership.ValidateUser(),它没有ASP.NET成员资格提供程序就无法工作,SimpleMembership (来源)不支持它(编辑:这不是完全正确的,参见下面的回答)。

编辑

我所做的是:

1)创建一个新的MVC Internet应用程序

2)通过Thinktecture.IdentityModel安装NuGet

3)通过脚手架创建模型和api控制器:

代码语言:javascript
运行
复制
public class Goober
{
    public int GooberId { get; set; }
    public string GooberWords { get; set; }
}

4)运行项目,创建新用户,并使用Fiddler创建新Goober

5)在GetGoober中添加了授权(Int id)

6)在WebApiConfig.cs中添加:

代码语言:javascript
运行
复制
var authConfig = new AuthenticationConfiguration();

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

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

当我运行这个项目并使用Fiddler点击api/goober/1时,我会得到一个401 www认证:未指定的。但是,如果我首先使用AccountController登录,然后使用Fiddler,我会得到一个200,一切都很有趣。

编辑

好吧,我认为这个问题与我最初的问题无关。我怀疑这与模板中SimpleMembership的初始化有关。当我打开项目并运行调试,然后使用Fiddler点击api时,我无法通过8月。但是当我简单地点击网站前端的“注册”链接时,我就可以通过8月了。我猜是因为InitializeSimpleMembershipAttribute是在AccountController上调用的,所以在调用控制器之前不会初始化吗?

我试过用WebSecurity.Login()代替Membership.ValidateUser(),但这是行不通的。

我不知道如何真正实现这一点。有人有什么建议吗?还是我试图从错误的角度来解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2012-12-15 11:19:13

ASP.NET成员资格提供程序与SimpleMembershipProvider不兼容是正确的,但是SimpleMembershipProvider支持ValidateUser,请参阅这里。假设SimpleMembership是正确配置和独立的,那么您仍然应该能够调用Membership.ValidateUser()

如果您已经尝试过Membership.ValidateUser()并得到一个错误,请告诉我,我们可以尝试解决它。

更新

因此,在遵循你的复制步骤之后,我设法指出了一个错误。将Thinktecture AuthenticationHandler处理程序内联并在调试中运行。在向api控制器发出请求后30秒,将引发数据库连接错误。这是异步和静默失败的。

经过一些摆弄之后,我相信是DefaultConnection连接字符串出错了。

和我一样,您的默认连接可能包含如下文件名: AttachDBFilename=|DataDirectory|\aspnet-MvcApplication3-20121215104323.mdf“

当在应用程序启动时注册的委托中调用ValidateUser (为了验证凭据),似乎无法解决|DataDirectory|,我发现通过将这个路径更新到全名,我的连接问题就消失了。

代码语言:javascript
运行
复制
<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>

然后我找到了这个post 这里,它表明AppDomain在这一点上没有正确设置它的数据目录。

因此,一旦配置设置和连接字符串更改为正确的文件路径和用户名"test“和密码”测试“,此请求通过fiddler获得200:

代码语言:javascript
运行
复制
GET http://localhost/api/goober/1
User-Agent: Fiddler
Host: localhost
Authorization: Basic dGVzdDp0ZXN0aW5n

作为备用

我发现,为了获得表单授权令牌,也允许访问api控制器,我必须添加以下内容。否则,Thinkteckture代码将该原则设置为匿名:

加上这个

代码语言:javascript
运行
复制
authConfig.InheritHostClientIdentity = true;

要抵消 (第52行):

代码语言:javascript
运行
复制
if (_authN.Configuration.InheritHostClientIdentity == false)
{
   //Tracing.Information(Area.HttpAuthentication, "Setting anonymous principal");
   SetPrincipal(Principal.Anonymous);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13886958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档