我正在尝试加密一些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/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) 好的,这是我创建身份验证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 MVC 3(以及MVC)的新手.在ASP.NET Web窗体中,我使用Principals和Identities进行了身份验证.这是在MVC中这样做的推荐方法还是有更新的东西?我看到了一个会员级别,但如果我理解正确的话,它对于我需要的东西来说太重了.
有没有人有一个很好的教程或网站建议来帮助我解决这个问题?它可以是全面的,因为我仍然没有固化这些东西.
谢谢.
我正在创建一些"记住我"功能,作为登录的一部分.
当我在登录过程中使用以下内容创建持久性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时使用的默认时间长度是多少?
在我的应用程序中,我使用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)
在我的客户全局过滤器中,我检查用户是否存在,如果不存在,我将其签出.但是,它不起作用.通过工作我的意思是他们通过身份验证并获得应用程序访问权限
提前致谢.
我怎样才能在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
我有两个有限的背景:
前者是现有的成熟产品,然而,它缺乏架构(SmartUI)导致难以维护的代码库,现在更加明显可见的可扩展性和可扩展性.
我们通过引入一个新的后端应用程序来迭代地解决这个问题 - 可以通过OWIN/WebAPI服务进行公开.
目前,我们只希望在新应用程序中利用cookie身份验证.最初,我认为使用基于FormsAuthenticationTicket的现有cookie身份验证/验证将是轻而易举的.显然这不是真的.
在我们的WebForms应用程序中,我们使用MachineKey来指定我们的decryptionKey和validationKey以支持我们的Web场.在.NET4中,如果我没有弄错的话,默认算法是AES.我认为如果默认值不够,利用这些信息构建我们自己的TicketDataFormat会很简单.
第一件事:
理想情况下,我们不打算将我们的主应用程序更新到.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
这是应该非常简单的事情之一,我无法弄清楚为什么它不起作用.
我正在尝试为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
我目前正在为汽车经销商开展一个大项目,我陷入两难境地.
我应该使用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)