- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建自己的依赖于 FormsAuthentication
的身份验证机制。我基本上使用 OAuth 来允许用户在授权服务器中进行身份验证,一旦他们通过身份验证,我需要使用 FormsAuthentication
在整个 session 中对他们进行身份验证。所以无论如何,我创建了一个 HttpModule 和一个帮助器类来完成这项工作。不幸的是,事实并非如此。
发生的情况是,在 PostAuthenticateRequest
上,我对票证进行加密并向响应添加 cookie,然后将用户重定向到网站的根目录。一旦用户被重定向,就会发出另一个 HTTP 请求,以便再次触发 HttpModule
,并且在 AuthenticateRequest
事件中,我将检查该用户是否已通过身份验证。为了检查用户是否经过身份验证,我尝试读取 cookie,从中获取用户名,然后设置 Thread.CurrentPrincipal 属性。但是,由于某种原因,找不到 cookie。
这是我的代码:
public class OAuthModule : IHttpModule
{
private const String USERNAME = "username";
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.AuthenticateRequest += context_AuthenticateRequest;
context.PostAuthenticateRequest += context_PostAuthenticateRequest;
}
void context_PostAuthenticateRequest(object sender, EventArgs e)
{
var application = sender as HttpApplication;
if (application != null)
{
String username = application.Context.Items[USERNAME].ToString();
String uri = RemoveQueryStringFromUri(application.Context.Request.Url.AbsoluteUri);
var cookie = IdentityHelper.GetEncryptedFormsAuthenticationCookie(username, uri);
application.Context.Response.Cookies.Add(cookie);
application.Context.Response.Redirect(uri);
}
}
void context_AuthenticateRequest(object sender, EventArgs e)
{
HttpApplication application = sender as HttpApplication;
if (sender != null)
{
if (!application.Context.Request.Url.AbsolutePath.Contains("."))
{
if (!IdentityHelper.IsAuthenticated)
{
HttpContextWrapper wrapper = new HttpContextWrapper(application.Context);
String clientId = WebConfigurationManager.AppSettings["ClientId"];
String clientSecret = WebConfigurationManager.AppSettings["ClientSecret"];
String authorizationServerAddress = WebConfigurationManager.AppSettings["AuthorizationServerAddress"];
var client = OAuthClientFactory.CreateWebServerClient(clientId, clientSecret, authorizationServerAddress);
if (String.IsNullOrEmpty(application.Context.Request.QueryString["code"]))
{
InitAuthentication(wrapper, client);
}
else
{
OnAuthCallback(wrapper, client);
}
}
}
}
}
private void InitAuthentication(HttpContextWrapper context, WebServerClient client)
{
var state = new AuthorizationState();
var uri = context.Request.Url.AbsoluteUri;
uri = RemoveQueryStringFromUri(uri);
state.Callback = new Uri(uri);
var address = "https://localhost";
state.Scope.Add(address);
OutgoingWebResponse outgoingWebResponse = client.PrepareRequestUserAuthorization(state);
outgoingWebResponse.Respond(context);
}
private void OnAuthCallback(HttpContextWrapper context, WebServerClient client)
{
try
{
IAuthorizationState authorizationState = client.ProcessUserAuthorization(context.Request);
AccessToken accessToken = AccessTokenSerializer.Deserialize(authorizationState.AccessToken);
String username = accessToken.User;
context.Items[USERNAME] = username;
}
catch (ProtocolException e)
{
EventLog.WriteEntry("OAuth Client", e.InnerException.Message);
}
}
private String RemoveQueryStringFromUri(String uri)
{
int index = uri.IndexOf('?');
if (index > -1)
{
uri = uri.Substring(0, index);
}
return uri;
}
}
public class IdentityHelper
{
public static Boolean IsAuthenticated
{
get
{
String username = DecryptFormsAuthenticationCookie();
if (!String.IsNullOrEmpty(username))
{
SetIdentity(username);
return Thread.CurrentPrincipal.Identity.IsAuthenticated;
}
return false;
}
}
private static String DecryptFormsAuthenticationCookie()
{
var cookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
if (cookie != null)
{
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value);
return ticket.UserData;
}
return String.Empty;
}
internal static HttpCookie GetEncryptedFormsAuthenticationCookie(String username, String domain)
{
var expires = DateTime.Now.AddMinutes(30);
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, username, DateTime.Now, expires, true, username, FormsAuthentication.FormsCookiePath);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName);
cookie.Value = FormsAuthentication.Encrypt(ticket);
cookie.Domain = domain;
cookie.Expires = expires;
return cookie;
}
private static void SetIdentity(String username)
{
ClaimsIdentity claimsIdentity = new ClaimsIdentity(new List<Claim> { new Claim(ClaimTypes.Name, username) });
var principal = new ClaimsPrincipal(claimsIdentity);
Thread.CurrentPrincipal = principal;
}
}
我哪里出错了?有什么想法吗?
最佳答案
好吧,我终于解决了。就这么简单:
application.Context.Response.Redirect(uri, false);
我需要告诉模块不要终止当前响应(因此是 false
),以便它将在即将到来的请求中保留 cookie。
关于asp.net - 加密和解密 FormsAuthenticationTicket 以验证用户身份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15416091/
我正在寻找一种解决方案,我们可以在其中制作具有很长有效期的 FormsAuthenticationTicket(和相应的 cookie)。这可以通过设置高值或使用滑动过期来实现,但是当网站的应用程序池
我一直在网上搜索并找到了许多奇怪的答案,而且我几乎尝试了所有这些答案。我的问题是这样的。我的登录页面包含: FormsAuthenticationTicket ticket = new FormsAu
这是我在登录成功时调用的函数。 (我对这个 FormAuthentication 很陌生) public static void CreateLoginCookie(User u) { Forms
我正在尝试重新创建我的 cookie,通常由 FormsAuthentication.SetAuthCookie() 生成的 cookie 以及 webconfig 中的内容。
在我的登录页面上,FormsAuthenticationTicket 被设置为带有一些自定义用户数据的持久性 cookie。现在我需要更改此自定义用户数据,因此它包含一个多参数。当以前登录的用户下次访
我正在根据本教程使用表单例份验证为 ASP.Net 4.0 站点实现自定义标识类: Forms Authentication Configuration and Advanced Topics 我想在
我正在努力了解 FormsAuthenticationTicket 类中的 isPersistent 属性的用途。 http://msdn.microsoft.com/en-us/library/ky
我在使用 FormsAuthenticationTicket 创建非持久性 cookie 时遇到问题。我想在票证中存储用户数据,所以我不能使用 FormsAuthentication.SetAuthC
我正在使用 FormsAuthenticationTicket并放置数据并在所有页面之间传递数据。 如果我们不更改任何数据,它将起作用。 所以,现在如果我想更改数据并将其传递给 cookie 并加密,
我正在尝试创建自己的依赖于 FormsAuthentication 的身份验证机制。我基本上使用 OAuth 来允许用户在授权服务器中进行身份验证,一旦他们通过身份验证,我需要使用 FormsAuth
我正在尝试检查用户当前 FormsAuthenticationTicket 的 Expired 属性,以查看身份验证期限是否已过期。但是,当期限到期时,我永远无法获得足够的信息来创建票证以进行检查。我
通常我使用用户的电子邮件地址(唯一),但在我当前的项目中,从 User.Identity.Name 中获取用户全名(非唯一)会更有利。 那么我为身份验证 cookie 名称设置的内容真的很重要吗? 请
当我在应用程序中创建身份验证机制时,我偶然发现了 FormsAuthenticationTicket.Version属性(property)。这些文档没有举例说明任何用例,我也没有发现它在其他地方使用
我已经使用自定义数据存储实现了我自己的自定义 MembershipProvider。到目前为止没有问题。我希望人们使用他们的电子邮件而不是用户名登录。因为我有自己的数据存储,所以这不是主要问题,我可以
我正在写一个 MVC 4 带有 的 Web 应用程序自定义认证授权 .当用户登录该站点时,我创建了一个 FormsAuthenticationTicket 并将其存储在 中 cookies publi
我正在考虑在我的 View 中使用它(Razor 语法)来获取我网站的用户名: @MySite.Helpers.Utils.UserName 这是 utils 类: public class Util
我有一个使用表单成员身份验证的 ASP.NET Web 应用程序。我们最近进行了渗透测试,标记的一个问题是窃取用户帐户的能力。如果 .ASPXAUTH cookie 值是在注销之前从用户复制的,用户可
在下面的方法中,我正在解密一个 cookie 以返回它,其中包含一个用户名。我尝试为它编写一个测试用例,但返回的 cookie 为空,因为它没有登录。谁能帮我写一个测试用例吗? public stri
我使用 FormsAuthenticationTicket 加密密码并将其存储到 session 值,当我检索它时我无法解密密码。 像下面这样加密 string pw="xyz"; F
我在 Logon 方法中设置 FormsAuthenticationTicket 以手动创建身份验证 cookie。如何验证该身份验证 cookie 并将其分配给 Current.User 对象。它是
我是一名优秀的程序员,十分优秀!