标签: forms-authentication

升级到ASP.NET 4.5/MVC 4表单身份验证失败

我刚刚使用ASP.NET 4.5和MVC 4.0加载了VS 2012,并且正在用一个示例应用程序开玩笑,发现与ASP.NET 4.0/MVC 3完美配合的表单身份验证似乎不再适用于最新发布的.

当我在动作控制器中调用Login函数时,WebSecurity.Login调用失败:

public ActionResult Login(LoginModel model, string returnUrl)
{
    if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
    {
        return RedirectToLocal(returnUrl);
    }

    // If we got this far, something failed, redisplay form
    ModelState.AddModelError("", "The user name or password provided is incorrect.");
    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

我已经用VS 2010源代码中的等效代码替换了此代码,并且也失败了(使用现已弃用的FormsAuthentication.Authenticate函数).

我的问题是:有没有人将MVC3移植到MVC4应用程序并找到了解决此问题的方法?我正在使用IIS Express,所以我想这可能会以某种方式引起一些问题,但如果你有任何想法,我会很感激.

我从我的asp.net 4/MVC3应用程序中复制了我的配置如下,但没有运气(这里是相关部分):

  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=tcp:sql2k1201.dbprovider.net;Initial Catalog=SQL2012_db;User ID=SQL2012_db_user;Password=dbpassword;" providerName="System.Data.SqlClient" />
  </connectionStrings>

  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />

    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="2880"/>
    </authentication>

    <membership>
      <providers>
        <clear/> …
Run Code Online (Sandbox Code Playgroud)

forms-authentication iis-express asp.net-mvc-4 asp.net-4.5

15
推荐指数
2
解决办法
2万
查看次数

ASP.NET MVC - 动态授权

我正在构建一个简单的CMS,其中角色是在管理面板中动态设置的.[Authorize(Roles="admin")]因此,例如添加授权控制器方法的现有方式已不再足够.角色 - 操作关系必须存储在数据库中,以便最终用户可以轻松地向/从管理面板中的其他人授予/获取权限.我该如何实现呢?

asp.net-mvc authorization forms-authentication roles content-management-system

14
推荐指数
2
解决办法
8296
查看次数

为什么ASP.NET在静态图像请求上形成身份验证设置cookie?

我有一个ASP.NET(MVC)网站,它提供静态内容(图像)以及来自同一域的动态内容.该站点使用表单身份验证,并具有登录控制器.人们发现自己随机登录或退出时出现了一些非常奇怪/不正常的问题,我们已经将其跟踪到一个问题,反向代理缓存了一个图像文件,该文件具有设置cookie响应标头身份验证cookie.一旦缓存,每个人都会得到相同的auth cookie,这会产生一些非常奇怪的结果.

我的问题是 - 图像如何首先得到一个固定的cookie标题?什么是ASP.NET表单身份验证模块正在做的事情 - 当然它在主HTML内容响应上设置cookie.我得到的是,然后将auth cookie与所有后续请求一起发送到域,但我无法弄清楚cookie是如何设置的.

(顺便说一句,这个问题也可能是至少两个现有大型电子商务网站的罪魁祸首,这些网站遇到类似问题,没有解决方案,因此这将是一个很好的解决方案).

响应如下所示(取自小提琴手).

HTTP/1.1 200 OK
Cache-Control: public, max-age=86400,max-age=86400
Content-Type: image/png
Last-Modified: Thu, 04 Nov 2010 16:00:52 GMT
Accept-Ranges: bytes
ETag: "0528474397ccb1:0"
Server: Microsoft-IIS/7.5
Set-Cookie: my-auth-cookie=6BC25F1EF71989466A48C0120E7739E; path=/; HttpOnly
Date: Wed, 17 Nov 2010 17:15:08 GMT
Content-Length: 15790
Run Code Online (Sandbox Code Playgroud)

更新:其他信息 - 我们在Win2008 R2,64位上使用IIS 7.5,该应用程序在使用集成管道/ .net 4的应用程序池下运行.

更新2:我不是在寻找问题的解决方案,我们已经有了解决方案.我正在寻找这个问题的答案,这就是为什么它首先发生的原因?请不要回答告诉我子域名或cookie如何工作!

更新3:添加请求:

GET https://www.example.com/sprite.png HTTP/1.1
Host: www.example.com
Connection: keep-alive
Cache-Control: no-cache
Pragma: no-cache
Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.44 Safari/534.7 …
Run Code Online (Sandbox Code Playgroud)

iis asp.net-mvc forms-authentication reverse-proxy

14
推荐指数
1
解决办法
3314
查看次数

表单身份验证ReturnUrl和子域用于单点登录

我有一个域http://abc.com和一个子域http://sub.abc.com.我正在通过共享表单身份验证cookie在两个站点之间实现单点登录.这是通过让两个站点在machineKey中共享validationKey和decryptionKey来实现的.

当用户点击子域中的页面时,我希望用户在根域中进行身份验证,并重定向回子域.用户当前被重定向到登录页面,但ReturnUrl想要重定向到根站点.

例如.目前:http://abc.com/login.aspx?ReturnUrl=%2fsecure%2fdefault.aspx

但我想要: http://abc.com/login.aspx?ReturnUrl=http:%2f%2fsub.abc.com%2fsecure%2fdefault.aspx

怎么能实现这一目标?

在我的子域名的web.config中,我当前配置了这样的auth:

<authentication mode="Forms">
  <forms name=".ASPNET" loginUrl="http://abc.com/login.aspx" protection="All" timeout="1440" path="/" domain="abc.com" enableCrossAppRedirects="true" />
</authentication>
Run Code Online (Sandbox Code Playgroud)

asp.net subdomain forms-authentication single-sign-on

14
推荐指数
2
解决办法
9199
查看次数

ASP.NET MVC:MembershipUser,Identity,MembershipProvider和Principal之间的关系

我需要ASP.NET MVC应用程序中的一些功能,在做了一些研究后,我觉得我必须实现自定义MembershipUser,MembershipProvider,Identity和Principal.我的问题是:我不理解MembershipUser和Identity之间的关系(如果有的话)以及MembershipProvider和Principal究竟在哪里.请有人请说清楚.我在网上发表了几篇关于所有四个参与者的文章和教程,但没有一个完全解决它们之间的关系.

另外:除了在Global.asax中的AuthenticateRequest期间,是否有一种优雅的方式将自定义主体分配给Context.User?我已经看到很多关于如何在ASP.NET WebForms应用程序中执行此操作的示例,我想知道ASP.NET MVC是否有更好的方法.

c# asp.net-mvc forms-authentication

14
推荐指数
1
解决办法
3971
查看次数

ASP.NET表单身份验证在iPad上显示登录页面

我有一个网络应用程序,当从iPad使用时显示奇怪的行为.有时,它会一直显示登录页面,即使用户经过身份验证,我也会创建一个存储在客户端上的cookie.

该应用程序是一个MVC2应用程序,我通过ajax调用控制器方法来执行身份验证.如果ajax调用成功,则客户端执行window.location.assign()以将用户导航到安全页面.(我这样做是为了支持全屏iPad Web应用程序模式)

我使用以下代码来创建cookie:

string formsCookieStr = string.Empty;
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
            1,                              // version
            username,                       // user name
            DateTime.Now,                   // issue time
            DateTime.Now.AddMinutes(30),    // expires
            false,                          // Persistence
            userRoleData                    // user data
    );
formsCookieStr = FormsAuthentication.Encrypt(ticket);
HttpCookie FormsCookie = new HttpCookie(FormsAuthentication.FormsCookieName, formsCookieStr);
HttpContext.Response.Cookies.Add(FormsCookie);
Run Code Online (Sandbox Code Playgroud)

验证的URL是/ Account/LogOn2.作为"安全"页面的网址是/ Admin

如果我查看IIS日志(下面),那么我可以看到第一次调用/ Account/LogOn2正在传递正确的用户名和密码.第二个日志条目显示了ajax调用随后产生的GET,并且您可以清楚地看到请求附带了一个新的ASPXAUTH cookie - 这是在第一次调用之后设置的cookie.为什么第二次调用导致302(重定向),当请求被正确认证时,如第二次调用中是否存在ASPXAUTH cookie所证明的那样?就好像服务器没有"看到"身份验证cookie并强制302重定向.第三个条目显示重定向,导致再次请求登录表单.

2011-06-07 16:33:37 W3SVC97442007 192.168.1.4 GET /Account/LogOn2 username=pete&password=wine&returnUrl=%2fProfileList 80 - 86.153.46.122 Mozilla/5.0+(iPad;+U;+CPU+OS+4_3_3+like+Mac+OS+X;+en-us)+AppleWebKit/533.17.9+(KHTML,+like+Gecko)+Mobile/8J3 .ASPXAUTH=214FCF8C485AD048B2A0833BCA77582097EBF8F88BC2B0A64D7CD4F2BD7B1D9CB0C4209DC82FFA93466A58462BCA7EAB0D35B8573CCC5AABDDD5F7ACD0D38FCCB7275A79606B990B8A189887F724BF4D30BF3F9474CCD872868FE6DB48A3825F8770116A1C142AAD99A195E5D46B7BD6DB8FCF709FDE79A6B4F70B99E9646B515946E82DD988231DCE8504E5B63134419A0A107CBB367ABC978BC71A5D7C2CEF;+ASP.NET_SessionId=5uu3m1db2iqgetgvmpjgnot2 200 0 0
2011-06-07 16:33:38 W3SVC97442007 192.168.1.4 GET /ProfileList - 80 - 86.153.46.122 Mozilla/5.0+(iPad;+U;+CPU+OS+4_3_3+like+Mac+OS+X;+en-us)+AppleWebKit/533.17.9+(KHTML,+like+Gecko)+Mobile/8J3 …
Run Code Online (Sandbox Code Playgroud)

asp.net forms-authentication ipad

14
推荐指数
1
解决办法
5260
查看次数

MVC自定义身份验证,授权和角色实现

请耐心等待我提供详细信息...

我有一个MVC站点,使用FormsAuthentication和自定义服务类进行身份验证,授权,角色/成员资格等.

认证

登录有三种方式:(1)电子邮件+别名,(2)OpenID,以及(3)用户名+密码.这三个人都获得了一个auth cookie并开始一个会话.前两个由访问者使用(仅限会话),第三个用于作者/管理员使用数据库帐户.

public class BaseFormsAuthenticationService : IAuthenticationService
{
    // Disperse auth cookie and store user session info.
    public virtual void SignIn(UserBase user, bool persistentCookie)
    {
        var vmUser = new UserSessionInfoViewModel { Email = user.Email, Name = user.Name, Url = user.Url, Gravatar = user.Gravatar };

        if(user.GetType() == typeof(User)) {
            // roles go into view model as string not enum, see Roles enum below.
            var rolesInt = ((User)user).Roles;
            var rolesEnum = …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc authorization forms-authentication session-state

14
推荐指数
2
解决办法
3万
查看次数

使用.NET FormsAuthentication和持久性cookie改变密码的安全漏洞?

好的,这是一个场景:

  1. Bob登录到使用.NET表单身份验证的mysite.com,然后勾选"记住我".
  2. Eve窃取了Bob的笔记本电脑
  3. 鲍勃得到一台新笔记本电脑,并更改了他的密码.

现在,在这一点上,Eve有一个被盗的笔记本电脑,它上面有一个持久的cookie,它将把她作为Bob登录到mysite.com - 据我所知,即使Bob改变了他的话,这也会有效.密码.

默认情况下,表单身份验证cookie不包含Bob的密码(无论是明文密码,散列密码还是其他加密密码) - 因此Bob的密码根本不涉及cookie身份验证过程,并且上周工作的用户名仍然可用今天.

这是一个容易解决的漏洞 - 通过简单地设置FormsAuthentication.SetAuthCookie("username:passwordHash")或其他东西,然后在您的身份验证处理程序中解密和拆分cookie - 但我很难相信这个问题存在于'开箱即用' ......我错过了什么吗?

编辑:请注意,我在这里假设"记住我"按钮的目的是阻止您每次访问网站时都输入密码.这适用于Facebook,Twitter,Gmail,以及我能想到的几乎所有其他网站 - 如果这不是.NET FormsAuthentication中'持久性cookie'选项的目的,我会感到非常惊讶.

此外,是的,我接受在每个传入的请求上执行双因素身份验证会产生一定的开销,但实际上它只比根据用户名从数据库中检索用户稍微贵一些,而您可能正在做的事情. .

编辑2:似乎至少有一个主要的.NET站点 - CodePlex.com - 容易受此影响; 见http://codeplex.codeplex.com/discussions/350646

asp.net security cookies forms-authentication

14
推荐指数
2
解决办法
1348
查看次数

如何锁定ASP.NET MVC中的路径?

我第一次玩MVC 4来查看与MVC 3相比已经更改/添加/等等的内容.

首先,我创建了一个空白的MVC 4 Web应用程序,并从头开始构建.

我注意到的第一件事与MVC 4不同的是,以下web.config设置对网页的可访问性没有影响:

<configuration>
    <location path="">
    <system.web>
      <authorization>
        <deny users="?"/>
      </authorization>
    </system.web>
    </location>
    .....
</configuration>
Run Code Online (Sandbox Code Playgroud)

回到MVC 3,上面的授权设置将拒绝所有匿名用户访问站点内的任何内容.但是,如果我将相同的设置添加到MVC4 Web.config文件中,则匿名者可以自由选择他/她选择的URL.

我在MVC 4中需要做什么来锁定所有路径,就像我在MVC 3中那样?

asp.net-mvc forms-authentication web-config asp.net-authorization

14
推荐指数
1
解决办法
3万
查看次数

如何在ASP.Net MVC控制器中正确使用ServiceStack身份验证

我在使用ServiceStack [Authentication]属性在ASP.Net MVC4控制器中工作时遇到问题,即使在正确提交登录详细信息之后,具有该属性的页面/操作方法也会将用户重定向到登录页面.

我遵循了SocialBootstrapApi示例,区别在于所有身份验证Web服务调用都是从控制器进行的:

this.CreateRestClient().Post<RegistrationResponse>("/register", model);
Run Code Online (Sandbox Code Playgroud)

到目前为止我做过的其他事情:

  • 使用我自己的用户会话实现子类化AuthUserSession(与示例没有太大区别,但使用我自己的User表实现)
  • 在我的BaseController上继承ServiceStackController,覆盖默认登录URL
  • 使用我的用户会话实现在AppHost中启用Auth功能

注册确实有效,用户身份验证逻辑工作(即使会话不存在),我可以在请求中看到ss-idss-pidcookie.

所以我的完整问题列表:

  1. 如何使[Authenticate]属性起作用(或者,我做错了什么)?
  2. 如何在MVC控制器中保存和重用用户会话?目前this.UserSession总是空的.
  3. 如何注销用户?this.CreateRestClient().Get<AuthResponse>("/auth/logout");似乎不起作用.

更新1:在我提交任何凭据之前,当我尝试加载安全页面(具有[Authenticate]属性的页面)时,会创建
会话cookie(ss-idss-pid).这是预期的行为吗?

更新2:
我可以看到会话保存在MemoryCacheClient,但试图在主控制器通过检索它this.Cache.Get<CustomUserSession>(SessionKey)返回null(其中SessionKey是这样的:urn:iauthsession:1)

c# authentication forms-authentication servicestack asp.net-mvc-4

14
推荐指数
1
解决办法
6792
查看次数