gpt4 book ai didi

asp.net-mvc-4 - MVC4 应用程序 + WebApi 中的 SimpleMembership 使用基本 HTTP 身份验证

转载 作者:行者123 更新时间:2023-12-02 09:39:16 28 4
gpt4 key购买 nike

我正在尝试实现具有以下要求的 MVC4 Web 应用程序:

(a) 它仅向经过身份验证的用户提供服务。至于身份验证,我想使用简单的成员资格,因为它是 MVC 的最新身份验证技术,使我能够定义自己的数据库表,提供开箱即用的 OAuth 支持,并且可以轻松与 MVC 和WebApi。

(b) 它通过 WebApi 为移动/JS 客户端公开一些核心功能,这些功能应通过基本 HTTP 身份验证 (+SSL) 进行身份验证。通常,我会让 JS 客户端使用 jQuery AJAX 调用 WebApi Controller ,并使用不同用户角色的 Authorize 属性进行修饰。

(c) 理想情况下,在混合环境中,我希望避免双重身份验证:即,如果用户已经通过浏览器进行身份验证,并且正在访问暗示 JS 调用 WebApi Controller 操作的页面,则 (a)机制应该足够了。

因此,虽然 (a) 由默认 MVC 模板涵盖,但 (b) 需要基本的 HTTP 身份验证,无需浏览器中介。为此,我应该创建一个像我在这篇文章中找到的那样的 DelegatingHandler:http://www.piotrwalat.net/basic-http-authentication-in-asp-net-web-api-using-message-handlers 。问题是它的实现需要某种方法从接收到的用户名和密码中检索 IPrincipal,而 WebSecurity 类没有为此提供任何方法(除了 Login 之外,但我会避免仅仅为了授权而更改登录用户,也是因为潜在的“混合”环境,如 (c))。所以看来我唯一的选择就是放弃简单的成员(member)资格。有人有更好的建议吗?以下是引用帖子中的相关(稍作修改)代码:

public interface IPrincipalProvider
{
IPrincipal GetPrincipal(string username, string password);
}

public sealed class Credentials
{
public string Username { get; set; }
public string Password { get; set; }
}

public class BasicAuthMessageHandler : DelegatingHandler
{
private const string BasicAuthResponseHeader = "WWW-Authenticate";
private const string BasicAuthResponseHeaderValue = "Basic";

public IPrincipalProvider PrincipalProvider { get; private set; }

public BasicAuthMessageHandler(IPrincipalProvider provider)
{
if (provider == null) throw new ArgumentNullException("provider");
PrincipalProvider = provider;
}

private static Credentials ParseAuthorizationHeader(string sHeader)
{
string[] credentials = Encoding.ASCII.GetString(
Convert.FromBase64String(sHeader)).Split(new[] { ':' });

if (credentials.Length != 2 || string.IsNullOrEmpty(credentials[0]) ||
String.IsNullOrEmpty(credentials[1])) return null;

return new Credentials
{
Username = credentials[0],
Password = credentials[1],
};
}

protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken)
{
AuthenticationHeaderValue authValue = request.Headers.Authorization;
if (authValue != null && !String.IsNullOrWhiteSpace(authValue.Parameter))
{
Credentials parsedCredentials = ParseAuthorizationHeader(authValue.Parameter);
if (parsedCredentials != null)
{
Thread.CurrentPrincipal = PrincipalProvider
.GetPrincipal(parsedCredentials.Username, parsedCredentials.Password);
}
}

return base.SendAsync(request, cancellationToken)
.ContinueWith(task =>
{
var response = task.Result;
if (response.StatusCode == HttpStatusCode.Unauthorized
&& !response.Headers.Contains(BasicAuthResponseHeader))
{
response.Headers.Add(BasicAuthResponseHeader,
BasicAuthResponseHeaderValue);
}
return response;
});
}
}

最佳答案

Here is another solution that meets all of your requirements 。它在 MVC 4 应用程序中使用 SimpleMemberhsip 并结合表单例份验证和基本身份验证。它还可以支持授权,但不需要将 Role 属性保留为空。

关于asp.net-mvc-4 - MVC4 应用程序 + WebApi 中的 SimpleMembership 使用基本 HTTP 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14819300/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com