标签: forms-authentication

System.Web.Security.FormsAuthentication.Encrypt返回null

我正在尝试加密一些userData以使用Forms身份验证创建我自己的自定义IPrincipal和IIdentity对象 - 我已将表示我登录用户的对象序列化为Json并创建了我的FormsAuthentication票证,如下所示:

string user_item = GetJsonOfLoggedinUser();/*get JSON representation of my logged in user*/

System.Web.Security.FormsAuthenticationTicket ticket = 
    new System.Web.Security.FormsAuthenticationTicket(1,
    WAM.Utilities.SessionHelper.LoggedInEmployee.F_NAME + " " 
    + WAM.Utilities.SessionHelper.LoggedInEmployee.L_NAME,
    DateTime.Now, DateTime.Now.AddMinutes(30), false, user_item);

string encrypted_ticket = System.Web.Security.FormsAuthentication.Encrypt(ticket);

HttpCookie auth_cookie = 
    new HttpCookie(System.Web.Security.FormsAuthentication.FormsCookieName,        encrypted_ticket);

Response.Cookies.Add(auth_cookie);
Run Code Online (Sandbox Code Playgroud)

但是,字符串encrypted_ticket总是如此null.user_item字符串的长度是否有限制?

谢谢穆斯塔法

asp.net forms-authentication

13
推荐指数
2
解决办法
4909
查看次数

ASP.NET Forms Auth允许在拒绝所有其他文件时访问子目录中的特定文件

我在允许特定角色访问子目录中的特定页面时遇到问题.

我的ASP.NET应用程序有一个目录,〜/ Forms/Administration具有有限的访问权限.有一个特定的文件,〜/ Forms/Administration/Default.aspx,我想给予1个额外的用户角色访问权限,以及Admin角色.

在〜/ Forms/Administration中,我有一个web.config文件,如下所示:

   <?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.web>
        <authorization>
            <allow roles="Administrator, User" />
            <deny users="*"/>
        </authorization>
    </system.web>

    <location path="Forms/Administration/Default.aspx">
        <system.web>
            <authorization>
                <allow roles="Administrator, User, AdditionalUser" />
            </authorization>
        </system.web>
    </location>

</configuration>
Run Code Online (Sandbox Code Playgroud)

Admin用户工作正常,但AdditionalUser总是失败.我尝试了很多东西 - 将位置列为

<location path="Forms/Administration/Default.aspx">
Run Code Online (Sandbox Code Playgroud)

并作为

<location path="~/Forms/Administration/Default.aspx">
Run Code Online (Sandbox Code Playgroud)

来自第一个通用规则的deny ="*"是先例吗?我试过改变

<deny users="*"/>
Run Code Online (Sandbox Code Playgroud)

<deny users="?"/>
Run Code Online (Sandbox Code Playgroud)

但最终会让ExtraUser访问所有内容.建议?

编辑:我尝试在通用拒绝规则之前放置位置特定允许,以防顺序重要.同样的问题.

更新:我在这里显然遗漏了一些东西:我删除了deny*config,留下了特定位置的部分.然后,我没有允许某些角色,而是将其设置为拒绝全部(*).但是,当我登录时,它并没有否认我.我甚至将规则简化为不是文件特定的,但适用于整个目录,并且它不会拒绝任何东西.但是,原始的非位置特定规则确实有效,因此我知道正在读取此配置文件.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <location path="Forms/Administration">
        <system.web>
            <authorization>
                <deny users="*" />
            </authorization>
        </system.web>
    </location>
</configuration>
Run Code Online (Sandbox Code Playgroud)

asp.net forms-authentication web-config

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

创建持久性身份验证cookie的问题:ASP.NET MVC

好的,这是我创建身份验证cookie的代码:

        // get user's role
        List<UserType> roles = rc.rolesRepository.GetUserRoles(rc.userLoginRepository.GetUserID(userName));
        List<string> rolesList = (from r in roles
                                 select r.ToString()).ToList();
        string[] rolesArr = rolesList.ToArray();

        // create encryption cookie
        FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
                1,
                userName,
                DateTime.Now,
                DateTime.Now.AddDays(90),
                createPersistentCookie,
                String.Join(";",rolesArr) //user's roles 
                );

        // add cookie to response stream
        string encryptedTicket = FormsAuthentication.Encrypt(authTicket);

        System.Web.HttpCookie authCookie = new System.Web.HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
        System.Web.HttpContext.Current.Response.Cookies.Add(authCookie);
        //FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);
Run Code Online (Sandbox Code Playgroud)

这是我在Global.asax中的代码,用于将用户角色设置为用户身份:

    protected void Application_AuthenticateRequest(Object sender, EventArgs e)
    {
        HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];
        if (authCookie == null || authCookie.Value == "")
        { …
Run Code Online (Sandbox Code Playgroud)

asp.net authentication forms-authentication asp.net-mvc-2

13
推荐指数
1
解决办法
6606
查看次数

ASP.NET MVC 3身份验证/授权

我是ASP.NET MVC 3(以及MVC)的新手.在ASP.NET Web窗体中,我使用Principals和Identities进行了身份验证.这是在MVC中这样做的推荐方法还是有更新的东西?我看到了一个会员级别,但如果我理解正确的话,它对于我需要的东西来说太重了.

有没有人有一个很好的教程或网站建议来帮助我解决这个问题?它可以是全面的,因为我仍然没有固化这些东西.

谢谢.

authorization forms-authentication asp.net-mvc-3

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

使用FormsAuthentication持久cookie超时

我正在创建一些"记住我"功能,作为登录的一部分.

当我在登录过程中使用以下内容创建持久性cookie时:

FormsAuthentication.SetAuthCookie("someusername", true);
Run Code Online (Sandbox Code Playgroud)

我的Web.Config看起来如下:

<authentication mode="Forms">
  <forms loginUrl="~/sign-in" timeout="2880" />
</authentication>
Run Code Online (Sandbox Code Playgroud)

在要求用户再次提供其登录详细信息之前,cookie有效期为多久?此外,是否/设置持久性cookie时使用的默认时间长度是多少?

asp.net cookies forms-authentication remember-me

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

如何在其他用户更改其用户名时强制注销用户?

在我的应用程序中,我使用Forms-Authentication登录并注销用户.

一个功能是管理员可以更改其他用户的用户名.在这种情况下,我需要注销用户名已更改的用户.

如果我不这样做,由于之前设置了cookie,他们可以访问应用程序并收到错误消息(因为他们的用户名不存在,并且有些部分我使用他们的用户名来实现某些功能).

如何强制这些用户使用Forms-Authentication注销?

更新:

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        string controller = filterContext.RouteData.Values["controller"].ToString();
        string action     = filterContext.RouteData.Values["action"].ToString(); ;
        // Below returns the previous username, which does not exist anymore in db.
        string userName = HttpContext.Current.User.Identity.Name;

        UnitOfWork unitOfWork = new UnitOfWork();

        if (!unitOfWork.UserRepository.UserExists(userName))
        {
            FormsAuthentication.SignOut();
            filterContext.HttpContext.Session.Clear();
            filterContext.HttpContext.Session.Abandon();
            // I am not using Roles.


        }
        unitOfWork.Dispose();
        base.OnActionExecuting(filterContext);

    }
Run Code Online (Sandbox Code Playgroud)

在我的客户全局过滤器中,我检查用户是否存在,如果不存在,我将其签出.但是,它不起作用.通过工作我的意思是他们通过身份验证并获得应用程序访问权限

提前致谢.

c# asp.net-mvc forms-authentication

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

MVC 5使用旧表单身份验证而不是OWIN

我怎样才能在mvc 5中使用asp.net mvc 3/4中的表单身份验证?

我有一个mvc 4应用程序,我想与mvc 5中的管理仪表板连接,并最终将主应用程序转换为mvc 5,但我想保持身份验证AS IS或以某种方式将其转换为新的auth方法.

我搜索了一段时间,但我发现的是如何使用新的OWIN身份验证(imo ms`版本的dotnetopenauth).如果你们知道有用信息的链接或者可以在这里回答我,请这样做.

谢谢!

asp.net authentication forms-authentication asp.net-mvc-4 asp.net-mvc-5

13
推荐指数
1
解决办法
8221
查看次数

OWIN自主CookieAuthentication和旧版.NET 4.0应用程序/ FormsAuthenticationTicket

我有两个有限的背景:

  1. ASP.NET 4.0 MVC/WebForms应用程序
  2. OWIN自托管与ASP.NET Web API 2

前者是现有的成熟产品,然而,它缺乏架构(SmartUI)导致难以维护的代码库,现在更加明显可见的可扩展性和可扩展性.

我们通过引入一个新的后端应用程序来迭代地解决这个问题 - 可以通过OWIN/WebAPI服务进行公开.

目前,我们只希望在新应用程序中利用cookie身份验证.最初,我认为使用基于FormsAuthenticationTicket的现有cookie身份验证/验证将是轻而易举的.显然这不是真的.

在我们的WebForms应用程序中,我们使用MachineKey来指定我们的decryptionKey和validationKey以支持我们的Web场.在.NET4中,如果我没有弄错的话,默认算法是AES.我认为如果默认值不够,利用这些信息构建我们自己的TicketDataFormat会很简单.

第一件事:

  • 如果你自主机与OWIN,默认TicketDataFormat使用DPAPI并没有 ASP.NET IIS的machineKey.
  • 在.NET 4.5中,Microsoft使MVC/WebForms MachineKey管道更具可扩展性.您可以使用自己的实现替换它,而不仅仅是更改算法.

理想情况下,我们不打算将我们的主应用程序更新到.NET 4.5来替换cookie加密.有谁知道将OWIN的CookieAuthentication与现有的FormsAuthenticationTicket集成的方法?

我们试图创建自定义: IDataProtector,SecureDataFormat<AuthenticationTicket>,IDataSerializer<AuthenticationTicket>的实现.IDataSerializer将负责FormsAuthenticationTicket和AuthenticationTicket之间的转换.

不幸的是,我无法找到有关微软机票加密的准确信息.以下是IDataProtector的示例构思:

public byte[] Unprotect(byte[] protectedData)
{
    using (var crypto = new AesCryptoServiceProvider())
    {
        byte[] result = null;
        const Int32 blockSize = 16;
        crypto.KeySize = 192;
        crypto.Key = "<MachineKey>".ToBytesFromHexadecimal();
        crypto.IV = protectedData.Take(blockSize).ToArray();
        crypto.Padding = PaddingMode.None; // This prevents a padding exception thrown.

        using (var decryptor = crypto.CreateDecryptor(crypto.Key, crypto.IV)) …
Run Code Online (Sandbox Code Playgroud)

asp.net forms-authentication formsauthenticationticket asp.net-web-api owin

13
推荐指数
1
解决办法
5638
查看次数

通过web.config进行身份验证,不在ASP.net 3.5中进行身份验证

这是应该非常简单的事情之一,我无法弄清楚为什么它不起作用.

我正在尝试为ASP.net 3.5应用程序设置一些非常快速的身份验证,但是将用户名和密码存储在web.config文件中(我知道它不是很安全,但它是一个内部应用程序,我不断被要求添加和删除登录,这是最快的方法).

所以,相关的配置部分如下所示:

<authentication mode="Forms">
   <forms loginUrl="~/login.aspx">
    <credentials>
     <user name="user" password="password" />
     <user name="user2" password="password2" />
    </credentials>
   </forms>
  </authentication>

  <authorization>
    <deny users="?"/>
  </authorization>
Run Code Online (Sandbox Code Playgroud)

并且,在登录页面中,代码如下所示:

string username = tbUsername.Text;
string password = tbPassword.Text;

if (FormsAuthentication.Authenticate(username, password))
    FormsAuthentication.RedirectFromLoginPage(username, false);
Run Code Online (Sandbox Code Playgroud)

但是,FormsAuthentication.Authenticate(用户名,密码)始终返回false.我无法弄清楚原因.

我甚至尝试使用Membership.ValidateUser但只是在本地数据库中添加到App_Data文件夹.

有什么东西真的很基本我忘了这里或者这在.net 3.5中根本不起作用吗?

asp.net authentication authorization forms-authentication web-config

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

ASP.NET标识 - 使用多提供程序的自定义实现

我目前正在为汽车经销商开展一个大项目,我陷入两难境地.

我应该使用ASP.NET身份还是旧式的FormsAuthentication?

我需要能够通过2个提供商登录.首先,用户总是在数据库中,但是我们检查它是否是LDAP用户,如果是,则通过LDAP进行身份验证(我使用WebService作为具有Login方法的用户).

这是我的登录方法:

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Login(LoginModel model)
    {
        if (ModelState.IsValid)
        {
            var userInDb = this.db.Users.FirstOrDefault(u => u.Username == model.username);

            if (userInDb != null)
            {
                // USER EXISTS
                if (userInDb.IsLdap)
                {
                    try
                    {
                        // IS LDAP POWERED, IGNORE PASSWORD IN DB
                        using (var ws = WebServiceClient.Factory(model.GetDomain()))
                        {
                            // MAKE AUTH
                            var result = await ws.Login(model.GetUsername(), model.password);

                            if (result.Success)
                            {
                                // USER IS LEGAL
                                FormsAuthentication.SetAuthCookie(model.username, model.remember);

                                return RedirectToAction("Init");
                            }
                            else
                            {
                                // USER IS ILLEGAL
                                ModelState.AddModelError("", "Username …
Run Code Online (Sandbox Code Playgroud)

c# asp.net forms-authentication asp.net-identity

12
推荐指数
1
解决办法
1089
查看次数